URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Submission: On May 15 via manual from DE

Summary

This website contacted 68 IPs in 11 countries across 40 domains to perform 206 HTTP transactions. The main IP is 77.247.84.129, located in Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust RSA CA 2018 on July 27th 2018. Valid for: a year.
This is the only time www.golem.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
38 77.247.84.129 25291 (SYSELEVEN...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
4 2a00:13c8:f5:... 25291 (SYSELEVEN...)
4 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
1 2 161.156.66.178 36351 (SOFTLAYER)
10 2a00:1450:400... 15169 (GOOGLE)
1 13.32.223.202 16509 (AMAZON-02)
1 104.111.214.228 16625 (AKAMAI-AS)
4 10 2.19.33.59 20940 (AKAMAI-ASN1)
1 80.82.201.88 48173 (UNBELIEVA...)
5 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
19 172.217.22.66 15169 (GOOGLE)
1 138.201.125.235 24940 (HETZNER-AS)
3 6 104.111.215.171 16625 (AKAMAI-AS)
8 136.243.2.136 24940 (HETZNER-AS)
4 2a00:1450:400... 15169 (GOOGLE)
3 185.33.223.221 ()
1 173.241.240.220 ()
4 185.86.138.32 201081 (SMARTADSE...)
1 185.64.189.112 62713 (AS-PUBMATIC)
2 35.203.66.107 ()
5 2a00:1450:400... ()
2 2a00:1450:400... 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.103.65 ()
1 138.197.186.29 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
3 148.251.131.173 24940 (HETZNER-AS)
1 77.247.84.149 25291 (SYSELEVEN...)
8 138.201.126.14 24940 (HETZNER-AS)
1 52.216.9.109 16509 (AMAZON-02)
1 2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... ()
2 2 216.58.210.2 ()
1 2.20.169.32 16625 (AKAMAI-AS)
1 13.32.223.37 ()
6 23.111.11.152 ()
2 2a01:4f8:202:... ()
7 95.216.24.150 24940 (HETZNER-AS)
1 13.32.223.215 ()
1 151.101.121.108 54113 (FASTLY)
6 37.252.172.249 29990 (ASN-APPNEXUS)
2 2 37.252.173.38 ()
1 2606:4700:30:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
1 52.216.108.213 16509 (AMAZON-02)
1 13.32.223.246 16509 (AMAZON-02)
3 2a03:2880:f01... 32934 (FACEBOOK)
3 148.251.69.233 24940 (HETZNER-AS)
2 2 52.51.38.48 ()
1 1 136.243.12.39 ()
2 2 37.157.2.236 ()
1 78.46.21.37 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 136.243.94.77 24940 (HETZNER-AS)
1 2 173.241.240.143 36089 (OPENX-AS1)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
2 104.111.215.51 16625 (AKAMAI-AS)
1 104.111.215.68 16625 (AKAMAI-AS)
1 136.243.61.70 24940 (HETZNER-AS)
2 2a03:2880:f11... 32934 (FACEBOOK)
1 89.163.159.107 24961 (MYLOC-AS)
1 62.168.44.119 5588 (GTSCE GTS...)
4 52.211.223.42 16509 (AMAZON-02)
1 52.29.82.21 16509 (AMAZON-02)
1 2600:9000:20b... 16509 (AMAZON-02)
1 85.114.144.107 24961 (MYLOC-AS)
1 18.202.123.193 ()
1 1 89.163.159.108 ()
1 52.213.21.157 ()
206 68
Apex Domain
Subdomains
Transfer
52 golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.2.damoh.golem.de
ssl.1.damoh.golem.de
751 KB
24 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
418 KB
17 plista.com
static.plista.com
insights.plista.com
farm.plista.com
media.plista.com
163 KB
14 adnxs.com
ib.adnxs.com
cdn.adnxs.com
fra1-ib.adnxs.com
secure.adnxs.com
acdn.adnxs.com
38 KB
11 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
7 KB
10 googletagservices.com
www.googletagservices.com
193 KB
9 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
185 KB
8 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
8 meetrics.net
lb100.s400.meetrics.net
2 KB
7 selfcampaign.com
lib.selfcampaign.com
delivery.selfcampaign.com
track2.selfcampaign.com
track.selfcampaign.com
6 KB
5 adscale.de
ih.adscale.de
js.adscale.de
8 KB
5 google.de
adservice.google.de
952 B
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 smartadserver.com
prg.smartadserver.com
5 KB
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
13 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 facebook.net
connect.facebook.net
72 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
59 KB
3 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
3 districtm.io
dmx.districtm.io
cdn.districtm.io
520 B
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 facebook.com
www.facebook.com
246 B
2 adform.net
c1.adform.net
461 B
2 adsrvr.org
match.adsrvr.org
863 B
2 googleapis.com
imasdk.googleapis.com
81 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
114 B
2 vgwort.de
ssl-golem.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
673 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 2mdn.net
s0.2mdn.net
10 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 google.com
adservice.google.com
249 B
1 nuggad.net
si.nuggad.net
1 KB
1 mxcdn.net
s400.mxcdn.net
45 KB
1 yieldlove.com
cdn-a.yieldlove.com
87 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
62 KB
206 40
Domain Requested by
38 www.golem.de www.golem.de
pagead2.googlesyndication.com
19 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
10 tracking.m6r.eu 4 redirects www.golem.de
cdn.m6r.eu
10 www.googletagservices.com cdn.stroeerdigitalgroup.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
9 static.plista.com www.golem.de
static.plista.com
8 lb100.s400.meetrics.net www.golem.de
7 tt.onthe.io cdn.onthe.io
6 fra1-ib.adnxs.com www.golem.de
cdn.adnxs.com
5 tpc.googlesyndication.com securepubads.g.doubleclick.net
5 adservice.google.de www.googletagservices.com
4 ih.adscale.de 3 redirects js.adscale.de
4 prg.smartadserver.com cdn-a.yieldlove.com
4 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
4 video.golem.de www.golem.de
text
4 cpxl.golem.de www.golem.de
3 track2.selfcampaign.com www.golem.de
3 connect.facebook.net lib.selfcampaign.com
connect.facebook.net
3 media.plista.com www.golem.de
3 insights.plista.com static.plista.com
www.golem.de
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 ib.adnxs.com cdn-a.yieldlove.com
www.golem.de
2 uss.xplosion.de www.golem.de
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 www.facebook.com www.golem.de
connect.facebook.net
2 acdn.adnxs.com cdn-a.yieldlove.com
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 ssl.2.damoh.golem.de text
2 c1.adform.net 2 redirects
2 match.adsrvr.org 2 redirects
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 secure.adnxs.com 2 redirects
2 farm.plista.com static.plista.com
www.golem.de
2 cm.g.doubleclick.net 2 redirects
2 ssl.google-analytics.com 1 redirects
2 s3.amazonaws.com www.golem.de
text
2 lib.selfcampaign.com www.golem.de
2 de.ioam.de 1 redirects www.golem.de
2 googleads.g.doubleclick.net pagead2.googlesyndication.com
2 dmx.districtm.io cdn-a.yieldlove.com
www.golem.de
2 ssl-golem.met.vgwort.de 1 redirects www.golem.de
2 ads.golem.de www.golem.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.emetriq.de ups.xplosion.de
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 js.adscale.de cdn.stroeerdigitalgroup.de
1 ads.pubmatic.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 ssl.1.damoh.golem.de text
1 s0.2mdn.net imasdk.googleapis.com
1 track.selfcampaign.com 1 redirects
1 delivery.selfcampaign.com lib.selfcampaign.com
1 cdn.radiantmediatechs.com www.golem.de
1 cdn.adnxs.com static.plista.com
1 ad.yieldlab.net www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 cpx.golem.de www.golem.de
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 irqs.ioam.de script.ioam.de
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 adservice.google.com www.googletagservices.com
1 si.nuggad.net cdn.stroeerdigitalgroup.de
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 script.ioam.de www.golem.de
1 cdn.stroeerdigitalgroup.de www.golem.de
206 73
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.g.doubleclick.net
Google Internet Authority G3
2019-04-16 -
2019-07-09
3 months crt.sh
cdn-a.yieldlove.com
Amazon
2018-10-11 -
2019-11-11
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2018-08-10 -
2019-09-09
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
*.google.com
Google Internet Authority G3
2019-04-30 -
2019-07-23
3 months crt.sh
*.plista.com
COMODO RSA Domain Validation Secure Server CA
2017-04-11 -
2020-07-10
3 years crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.openx.net
DigiCert ECC Secure Server CA
2019-02-08 -
2020-05-12
a year crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
dmx.districtm.io
Let's Encrypt Authority X3
2019-04-06 -
2019-07-05
3 months crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2019-04-30 -
2019-07-23
3 months crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.google-analytics.com
Google Internet Authority G3
2019-04-16 -
2019-07-09
3 months crt.sh
*.selfcampaign.com
Starfield Secure Certificate Authority - G2
2018-06-28 -
2020-07-28
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-12-03 -
2019-10-25
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-04-24 -
2019-06-07
a month crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2019-03-19 -
2020-03-19
a year crt.sh
*.googleapis.com
Google Internet Authority G3
2019-04-16 -
2019-07-09
3 months crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-04-22 -
2019-07-21
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-05-09 -
2019-08-07
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2019-04-16 -
2019-07-09
3 months crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 21 frames:

Primary Page: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Frame ID: 1AB8AC7CF92A2DB256506FC27E337044
Requests: 159 HTTP requests in this frame

Frame: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Frame ID: 128F7FEC2C409B5D07E46932D2C104DB
Requests: 7 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/show_ads_impl.js
Frame ID: 81D70C61E5B61D1C1D0A6DD5C155E8C6
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20190513/r20190131/zrt_lookup.html
Frame ID: 8F96FC0D0A01820E0EA7481810A8BB6E
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=7370415692&adk=795422400&adf=1229236390&w=1000&lmt=1557932412&num_ads=2&guci=1.2.0.0.2.2.0.0&format=1000x120&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&flash=0&wgl=1&adsid=NT&dt=1557932412147&bpp=80&bdt=1389&fdt=471&idt=472&shv=r20190513&cbv=r20190131&saldr=aa&abxe=1&correlator=7081731796741&frm=20&pv=2&ga_vid=1778437804.1557932412&ga_sid=1557932412&ga_hid=2086780775&ga_fc=1&iag=0&icsg=3389671952879360&dssz=64&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=1840&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040081%2C21060853&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=4092314402&ifi=7&uci=7.mdxdn0ykektd&fsb=1&xpc=oaKIZBT4rK&p=https%3A//www.golem.de&dtd=504
Frame ID: C9CCBA13E28168AF57E15C236CC301DE
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssPvlxmnhQbruRzJv6IzJKk_ofpuoDxA8u3ZSeW_X6D1Uwd165HkGfVUGrLXFM21ESVK0W93CuNnjx3B4jRmoaXcNA8eRvmXgIDvsQ4Tse7NfMnK6D_NK6sslarTJ3hIpDqXfqXHrxAXbE8J4fAYalOIlHGBzmNVWCSMG49Yonfvr25TWe9BD0Iwg3kA85KFlAvTR-UZe_qMYS5IeVmRj7Qd9L-KD7yrm6KuTvEq2d7edi8Ku6X6M7-Cs0iLsOOX9Z0nAqcbaEyI0rMj937&sai=AMfl-YTWHctKtQrGjDx7IbZbzDph8Bq9wUAnB5LRlTphtDNdqye6UO8GHCZCPk6ngGNZx9pYhM2rOTNxBxpDTL9JwDl9swctQuDBH0rN0_szEQ&sig=Cg0ArKJSzK71JjJA_HucEAE&urlfix=1&adurl=
Frame ID: 7AECFF949716F1D4C4391E977AC0CFB4
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssELsb7IjNmruGbXTrNzGloo6P0xvqWYkU2J9ffsJ_MQO3ffsUMBEoyAT52Md1czQ7eBbJUvjOjwNdPlrsmMRnLWFVcpbc38g9A3LWh4htsd_h6Mdi1POfgCbdIpIbK6CKVZ0g0FiSsRd7A9z6nw-YDyzTU3YSp5YO_iuwvhaF6CD-pEt8jbhc6wN6rxAJoo0CiekbV8u_PcOh7BnWafaGmemF15EUmKVmq_Mzwbaf1XDjT6_JDD0lmheUE9JR9z4IDXA7okC35KSGOFQRY&sai=AMfl-YSXmyemNaJxNWPj1GvJHy1YcTd0MnuEX79Bp-jtYjxsTlsXRhQCj2g3_US07x7WadlaBL9bHfhHwCwyH_F2N00PGp7-dh7CPFC7vKl8ag&sig=Cg0ArKJSzJeVq-qFArwmEAE&urlfix=1&adurl=
Frame ID: ED745052F0BAE2CF345C2BCB80993280
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst_XGrvk9zI29XXiZMTLIo6qWSMLTWgztLiK9UKMhDi111KPJ8GR0p3LDpUCUda9uaq7ZJNG7hMyKOS8ZIOhcBVh5psWXZ8e9TJWYsKEWtOLGPQOcZGTlHJ5yj7u3MYRmnoEVFH_jM4xwNnIAgDSC6EeoUcp7eZqzHWaHEeVfzWtQB5V7gnwMLWgIe85ipu0kBevnkOTvsbNsbBTRPsAEh2FMmpOM9SCkLEBCisnb1NebGEkQTXBC2nxHyMCyvIZ1PH4SPFzNTFDVyutx7Q&sai=AMfl-YTkgPfvCynT_ec4kUygmYYBTNYmES9yswlR8WhmDlarF2Z6Bi2Ow5QkLigkmdfdwcztjYLKktnIlMKvF6hdh8s2limlUSB59ZvsWaplsA&sig=Cg0ArKJSzKM10vvE0hqxEAE&urlfix=1&adurl=
Frame ID: 9ED3AB90125C3914DFB6841274E3F770
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuXueoJv5m44ZfpQP6bYn5giMM30T2Np-cWQtjCDkhQAjjar4tOYa3d_H0cTZdWLezatCWm0dBVepurESrksEAutd4BX1RKtRpzrTvzKJ3r6NAHFfM8NzeA-ALPwSwW7LhCJ4lM5Kky0z3UDHPUEihRiNenoHYV-lQ6rTIANxSGRx5cBCtI5nWWfbxUs_UW8h95wDcKneu7slKLoZgGr0PR3psnD4IOSHLyQgoGa6yrx9YQaCLHJzjGu3nsSJLmS91O1guFvcNeYfLiXEFN&sai=AMfl-YRABWZNqDrNZvMx1Qty2dwiGoOSVuFs7Bb9tnYIptX4c4LITNbElFNj2b7giIT_mCIbsX0ytqmzC8ZH0mLV3YgUxDVlPxagGQJ46prwBA&sig=Cg0ArKJSzJ-RhLslPUBxEAE&urlfix=1&adurl=
Frame ID: D535430CE5482808C30C1BEB7746BB4E
Requests: 9 HTTP requests in this frame

Frame: https://delivery.selfcampaign.com/tag/146005/frame?title=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&meta_keywords=&meta_description=Eigentlich%20soll%20das%20Best-of-the-Web-Siegel%20die%20Sicherheit%20von%20Webseiten%20zertifizieren%2C%20stattdesse...
Frame ID: 93E729F3908BC87A8C6A0494B2E95133
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.304.0_de.html
Frame ID: 1FCEFAECBA026EE2328109527FC3B9C2
Requests: 1 HTTP requests in this frame

Frame: data://truncated
Frame ID: 026247ABA13CFCE16A101DCED232CE6F
Requests: 1 HTTP requests in this frame

Frame: https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Frame ID: 3DD26050D89793025325756F6521FB78
Requests: 1 HTTP requests in this frame

Frame: https://cdn.districtm.io/ids/index.html
Frame ID: F4BF2F04EAF2126EA367EA699FC06CE1
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: F5698A1BA36BBF4D3808D1B73282109E
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: E54B357D655C3C486944A253E34C52D3
Requests: 1 HTTP requests in this frame

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: AB5ADB78FA98B1A3F253655F0CB3A4C5
Requests: 1 HTTP requests in this frame

Frame: https://www.facebook.com/tr/
Frame ID: 706CCFD9D0C0BEF64AE5986837F3A3E8
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/map?ssl=1&format=video&nut&uu=6abcf183db9a4daf8b3a5cffac3322b1
Frame ID: 88B0FC14F561CCA82AF3568B387F5F79
Requests: 1 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4192566177285161413
Frame ID: E8190AB5BF220F2EB8AC20C0FE00AE6B
Requests: 1 HTTP requests in this frame

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: CC269604F8F6F8A050C12BE96E07BACC
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • env /^io$/i

Overall confidence: 100%
Detected patterns
  • headers server /nginx(?:\/([\d.]+))?/i

Overall confidence: 100%
Detected patterns
  • env /^io$/i

Overall confidence: 100%
Detected patterns
  • env /pbjs/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i

Overall confidence: 100%
Detected patterns
  • script /\/\/connect\.facebook\.net\/[^\/]*\/[a-z]*\.js/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i
  • env /^google_ad_/i
  • env /^__google_ad_/i
  • env /^Goog_AdSense_/i

Overall confidence: 100%
Detected patterns
  • env /^gaGlobal$/i

Overall confidence: 100%
Detected patterns
  • env /^googletag$/i

Overall confidence: 100%
Detected patterns
  • env /^szmvars$/i
  • env /^iam_data$/i

Overall confidence: 100%
Detected patterns
  • env /^jQuery$/i

Page Statistics

206
Requests

100 %
HTTPS

29 %
IPv6

40
Domains

73
Subdomains

68
IPs

11
Countries

2275 kB
Transfer

5710 kB
Size

0
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 17
  • https://ssl-golem.met.vgwort.de/na/8d3a440bbcf940299484ce12b865866d HTTP 302
  • https://ssl-golem.met.vgwort.de/blank.gif
Request Chain 21
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 68
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=001b&i2=001bd24191632e3df5cdc297b&ep=1579429357&vr=414&id=s9k4qs&i3=001bd24191632e3df5cdc297b%3A1585407612291%3A1557932412291%3A.golem.de%3A1%3Agolem%3AG_SEC%3Anoevent%3A1557932412291%3Ak9ir6d&n1=1&dntt=0&lt=1557932412294&ev=&cs=9op5i&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=001b&i2=001bd24191632e3df5cdc297b&ep=1579429357&vr=414&id=s9k4qs&i3=001bd24191632e3df5cdc297b%3A1585407612291%3A1557932412291%3A.golem.de%3A1%3Agolem%3AG_SEC%3Anoevent%3A1557932412291%3Ak9ir6d&n1=1&dntt=0&lt=1557932412294&ev=&cs=9op5i&mo=1&sr=71
Request Chain 84
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1059675225&utmhn=www.golem.de&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&utmhid=2086780775&utmr=-&utmp=%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&utmht=1557932412479&utmac=UA-518800-2&utmcc=__utma%3D21769261.1778437804.1557932412.1557932412.1557932412.1%3B%2B__utmz%3D21769261.1557932412.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=1353798243&utmredir=1&utmu=qBQAAAAAAAAAAAAAAAQAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1778437804.1557932412&jid=1353798243&_v=5.7.2&z=1059675225
Request Chain 87
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=998cee3ca0eb4d989df876eab0380ec3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D998cee3ca0eb4d989df876eab0380ec3%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=998cee3ca0eb4d989df876eab0380ec3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D998cee3ca0eb4d989df876eab0380ec3%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=5bab0b02e5f842a59242ac5dfa52c2c9 HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=998cee3ca0eb4d989df876eab0380ec3&userId=adscale-user:5bab0b02e5f842a59242ac5dfa52c2c9 HTTP 302
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=998cee3ca0eb4d989df876eab0380ec3&userId=adscale-user%3A5bab0b02e5f842a59242ac5dfa52c2c9&checkcookies=true
Request Chain 88
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=998cee3ca0eb4d989df876eab0380ec3
Request Chain 89
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=mYzuPKDrTZid-HbqsDgOww HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=mYzuPKDrTZid-HbqsDgOww&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 90
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=998cee3ca0eb4d989df876eab0380ec3
Request Chain 134
  • https://secure.adnxs.com/getuid?https%3A%2F%2Ffarm.plista.com%2Fmatching%2Fpixel%2F%3Fssp%3Dc3de%26dsp_user_id%3D$UID HTTP 302
  • https://secure.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Ffarm.plista.com%252Fmatching%252Fpixel%252F%253Fssp%253Dc3de%2526dsp_user_id%253D%24UID HTTP 302
  • https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=3494082633592885914
Request Chain 174
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=a0e64b983b4194198c0d4cf175d371ed HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=a0e64b983b4194198c0d4cf175d371ed HTTP 302
  • https://track.selfcampaign.com/map_td/?tdid=fa19d7f5-3fd6-4805-8b1e-222d3f17164a HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=fa19d7f5-3fd6-4805-8b1e-222d3f17164a
Request Chain 175
  • https://c1.adform.net/serving/cookie/match?party=1173 HTTP 302
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173 HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=8239299303467378195&source=adform
Request Chain 189
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Request Chain 207
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=6abcf183db9a4daf8b3a5cffac3322b1
Request Chain 212
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0WsbsBD_kEiaCBDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 307
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4192566177285161413

206 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
www.golem.de/news/
113 KB
31 KB
Document
General
Full URL
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e308c5b563f4ca46d35d9e3296a707ed62758a423d88a6a7d244209e61764e6e
Security Headers
Name Value
Strict-Transport-Security max-age=11001100; includeSubDomains; preload

Request headers

Host
www.golem.de
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Server
nginx
Date
Wed, 15 May 2019 15:00:10 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; expires=Thu, 16-May-2019 03:00:10 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
ETag
"PEAR-Cache-604decbdfee6009f5a37d338674916af"
Content-Encoding
gzip
Cache-Control
private
Vary
User-Agent, Accept-Encoding
golem_main_129-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_129-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5a7eb85e3b035673ff1e9f66977c697902a8be8235e3ebbd233b8d2636cfaed1

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:10 GMT
Content-Encoding
gzip
Last-Modified
Mon, 08 Apr 2019 19:14:59 GMT
Server
nginx
ETag
W/"5cab9db3-124d7"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:10 GMT
gg2_1-0-0-min.css
www.golem.de/staticrl/styles/
3 KB
1 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/gg2_1-0-0-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ff8d0cd9b6e1af7e78d6e1c78d2e71bd6c887ec2f83277305d69f8252f6c26d6

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:10 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-cc0"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:10 GMT
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:10 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-190c7"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:10 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
257 KB
62 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:194::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
95061a8820dde009f18dd271c6bdb828979a2aac2a79f931b066bc88df962fba

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:10 GMT
content-encoding
gzip
x-amz-request-id
3B581E392066AE48
status
200
access-control-max-age
86400
content-length
63276
x-amz-id-2
LMS+oXPOgCDw7U82Zcr0O91TdQ9LQr1xxwoeOGsFe3eX0zNSIEHILLSuLreoxuAI6D82b9pWXbY=
last-modified
Wed, 15 May 2019 14:32:24 GMT
server
KONICHIWA/1.0
etag
"1f2a8c5e247bd23c0427f94279591dd8"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=631
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:10 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Sat, 15 Jun 2019 15:00:10 GMT
141275-196127-196126_rc.jpg
www.golem.de/1905/
76 KB
77 KB
Image
General
Full URL
https://www.golem.de/1905/141275-196127-196126_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e6f7ca4fc92e11a42ddbb3a9d369ce4d42fb95faf2567f485a7769e51825706d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:10 GMT
Last-Modified
Wed, 15 May 2019 14:15:03 GMT
Server
nginx
ETag
"5cdc1ee7-13098"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
77976
Expires
Sat, 15 Jun 2019 15:00:10 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1557931142&f=ev&v=d&t=ad%2Fjobs2018kw10
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
799
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1557932041&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
798
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
finwave-snap.jpg
video.golem.de/teaser/1/1/22699/thumb-high-1000/
113 KB
114 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22699/thumb-high-1000/finwave-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1478c0f24c51bfaeb59e580f11f0baa3742eecf98db25f9f60c04a42ee35f59d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 02 Apr 2019 08:46:38 GMT
Server
nginx
ETag
"5ca3216e-1c54f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
116047
Expires
Sat, 15 Jun 2019 15:00:11 GMT
links.png
www.golem.de/_img/gg/
195 B
550 B
Image
General
Full URL
https://www.golem.de/_img/gg/links.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9e08d9b8d1eb5cfb13e10bc6afb3a6f3a40f6ac1f65c6ecd076dc66b7edafb6a

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Wed, 18 Feb 2009 13:50:45 GMT
Server
nginx
ETag
"499c1235-c3"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
195
Expires
Sat, 15 Jun 2019 15:00:11 GMT
rechts.png
www.golem.de/_img/gg/
197 B
552 B
Image
General
Full URL
https://www.golem.de/_img/gg/rechts.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
55e30adb2faf80e59e4a70a75809a573ed0acd7b6fb703bde722bd3ddf56584d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Wed, 18 Feb 2009 13:50:45 GMT
Server
nginx
ETag
"499c1235-c5"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
197
Expires
Sat, 15 Jun 2019 15:00:11 GMT
minus.png
www.golem.de/_img/gg/
404 B
760 B
Image
General
Full URL
https://www.golem.de/_img/gg/minus.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
600a0718bc411395294d3af96651470ec26c15c3f0a6ca3b579a523c9098b4ce

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Wed, 18 Feb 2009 13:50:44 GMT
Server
nginx
ETag
"499c1234-194"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
404
Expires
Sat, 15 Jun 2019 15:00:11 GMT
icon-ggfs_w2.png
www.golem.de/staticrl/images/
274 B
630 B
Image
General
Full URL
https://www.golem.de/staticrl/images/icon-ggfs_w2.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2abfcd790056afc481c48cd6f8e35b79b3bccf309ff6f2c0dfad0650df73d645

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-112"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
274
Expires
Sat, 15 Jun 2019 15:00:11 GMT
golemgallery2_125-min.js
www.golem.de/staticrl/scripts/
14 KB
5 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golemgallery2_125-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
96bff9a63428fcafaa40226d7ccf7b90ab5776979db144a62bdef6a7a77d5eec

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:10 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-36a9"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:10 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
474 B
Script
General
Full URL
https://www.golem.de/abo/account_js_dt18_1_0.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:10 GMT
Last-Modified
Wed, 15 May 2019 15:00:10 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Content-Type
application/javascript
Cache-Control
no-store, no-cache, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 26 Jul 1997 05:00:00 GMT
sdcv.js
ads.golem.de/
63 B
430 B
Script
General
Full URL
https://ads.golem.de/sdcv.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Sat, 15 Jun 2019 15:00:11 GMT
iam.js
script.ioam.de/
32 KB
10 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 001b
Resource Hash
5001af7fbfe85e73272a3a91ee6a17d6ce0b22ba6cf1ed690cb87a4b634bccc0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Content-Encoding
gzip
Last-Modified
Wed, 15 May 2019 15:00:11 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 001b
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
privat, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Wed, 15 May 2019 17:00:11 GMT
blank.gif
ssl-golem.met.vgwort.de/
Redirect Chain
  • https://ssl-golem.met.vgwort.de/na/8d3a440bbcf940299484ce12b865866d
  • https://ssl-golem.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-golem.met.vgwort.de/blank.gif
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.17 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.17
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Wed, 15 May 2019 15:00:11 GMT
Server
s2.50.17
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
gpt.js
www.googletagservices.com/tag/js/
31 KB
10 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3e8dadf2162e744a31d12d4935c7986dbc5c519a6829807c7582411c7972dc6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"166 / 993 of 1000 / last-modified: 1557857174"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10550
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:11 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
297 KB
87 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.32.223.202 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-32-223-202.fra56.r.cloudfront.net
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
e89fc0906dd590bbf06858059577b07695e00936b2a6fd5d64fc247c542a1c09

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 12:48:09 GMT
content-encoding
gzip
server
nginx/1.14.0 (Ubuntu)
age
7922
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=10800, public
x-amz-cf-id
E0SGRQ3g8GKo4pE_tUHC6pInLM5LZH4rxFAK2ebv1k3EAhUgk1-qRA==
via
1.1 be3a2ea70ea68d04665ee5db91a73443.cloudfront.net (CloudFront)
expires
Wed, 15 May 2019 15:48:09 GMT
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
115 KB
45 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.214.228 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-214-228.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
cd8cab6134789f4be73101396dea39afb45e9337fc310e1bd11d5ac6cd325ec8

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
45485
Expires
Wed, 15 May 2019 17:00:11 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Wed, 15 May 2019 15:00:11 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.golem.de
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72
rc
si.nuggad.net/
839 B
1 KB
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
80.82.201.88 Berlin, Germany, ASN48173 (UNBELIEVABLE-AS, DE),
Reverse DNS
pbtgx-nuggad.unbelievable-machine.net
Software
Apache /
Resource Hash
1fed4210a121c97f66f22e47237ee1355119cdc03c8e0ea6f8911428020dc1f9

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
200 OK
Cache-Control
no-store,no-cache
Connection
close
Content-Type
text/javascript
Keep-Alive
timeout=3, max=500
Content-Length
264
Expires
Wed, 18 Feb 2009 11:53:30 GMT
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Sat, 15 Jun 2019 15:00:11 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5870"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22640
Expires
Sat, 15 Jun 2019 15:00:11 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Sat, 15 Jun 2019 15:00:11 GMT
truncated
/
335 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
72ce44d1321e5caeec893cabdf662745ce2d8af68b65665b6e62e5f7bbcd5e0f

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-5074"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20596
Expires
Sat, 15 Jun 2019 15:00:11 GMT
integrator.js
adservice.google.de/adsid/
109 B
249 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
249 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
0
pubads_impl_2019050901.js
securepubads.g.doubleclick.net/gpt/
150 KB
55 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
a161cba4b2b8a90e2ca19e935256925fa3920b6ed129ec1568fccbd1a290b1b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
55799
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:11 GMT
dmp
tracking.m6r.eu/sync/
86 B
590 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
3b1bb65b3d74d5c4edff923cee0515de783915579828ca06f2b532f6194b492d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
99
minibanner_flat_620.shtml
www.golem.de/microsite/abo/ Frame 128F
963 B
792 B
Document
General
Full URL
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
653ecfa4fbb8a0a5085d4eb14fc668c8cd30ff0b51616f7a8032c88d7468ea93

Request headers

Host
www.golem.de
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Server
nginx
Date
Wed, 15 May 2019 15:00:11 GMT
Content-Type
text/html
Last-Modified
Wed, 16 May 2018 15:57:13 GMT
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Vary
Accept-Encoding
ETag
W/"5afc54d9-3c3"
X-UPSTREAM
hybrid2.golem.de
Content-Encoding
gzip
async.js
static.plista.com/
61 KB
17 KB
Script
General
Full URL
https://static.plista.com/async.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.125.235 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.235.125.201.138.clients.your-server.de
Software
nginx /
Resource Hash
7a8571861150568201139b95e61e158985c9184cb70f87f030f3f8f9f73d1b90
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

x-plista-versions
plista-plugin- libplista-php-0.0.0
date
Wed, 15 May 2019 15:00:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
x-plista-node
plista855
age
359
status
200
content-length
16625
last-modified
Wed, 15 May 2019 14:54:11 GMT
server
nginx
vary
Accept-Encoding
x-varnish
693218379 799190329
via
1.1 varnish-v4
cache-control
public, must-revalidate, proxy-revalidate
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Thu, 16 May 2019 14:54:12 GMT
btn-follow-sp4b.png
www.golem.de/staticrl/images/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4b.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Referer
https://www.golem.de/staticrl/styles/golem_main_129-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Last-Modified
Mon, 08 Apr 2019 18:48:10 GMT
Server
nginx
ETag
"5cab976a-b0e"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Sat, 15 Jun 2019 15:00:11 GMT
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/svg+xml
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.215.171 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-215-171.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Content-Encoding
gzip
Last-Modified
Mon, 13 May 2019 14:40:38 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
649
Expires
Thu, 16 May 2019 15:00:11 GMT
submit
lb100.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb100.s400.meetrics.net/bb-mx/submit?/ME3DBsAAA/whFaBo0F0wFz6BvvA33F3uBnvFslFtuBklFvuEl3FzvBilFz0FtvEmtB0oFltB3lFitB0yF1zF0tBzpFlnFlsFt2ElyF0lFpsF0tBrlF5sFvnFnlFytBx5Aw1AtxA0xAy3A1uAo0FtsFfpyF+k2FoywAx5AtwA1tAw2AtxAz6A10At2A35A2wAwtAyuAxwA5uAytAwmEm3B0yAzxAL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSH6APAAAAAAAAAOAAAAGBAAAAAAZwSH6ABRksFAQtjF5i+7SA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:11 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Wed, 15 May 2019 15:00:10 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DCtAAATkzFARksFAQtjFVrJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:11 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:10 GMT
truncated
/
66 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b71c20271d9c80d1a71aa0ab9935281c4fa8ac404533f1a0747d7fb03fc68e79

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/webp
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
87 KB
32 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
1a774f9ff4c82d8feaa8412ed8a2520174ebda464b59bf772967a319d520e3ed
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
32987
x-xss-protection
0
server
cafe
etag
15335191640353697486
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Wed, 15 May 2019 15:00:11 GMT
golem_csi-121-min.js
www.golem.de/staticrl/scripts/adsense/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-121-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:11 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-7ff"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:11 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
705 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.221 , Netherlands, ASN (),
Reverse DNS
316.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:13 GMT
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.43:80
AN-X-Request-Uuid
184b3fbe-beb4-4244-b47d-7826d29cdd46
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
706 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.221 , Netherlands, ASN (),
Reverse DNS
316.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:13 GMT
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.212:80
AN-X-Request-Uuid
21cdf1ab-15fd-49de-91a7-b5def08b48b1
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
arj
yieldlove-d.openx.net/w/1.0/
8 KB
2 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=0&tws=1600x1200&be=1&bc=hb_pb_2.1.6&dddid=50c53a63-a1bf-4d25-b03b-eb4478b45fa7%2Cef3fd487-9a00-4cee-9f3e-60aa8f8db0ee%2C8c0cb9bd-118e-4f61-99c0-445f82390b7f%2C8cb3df08-4d42-4a1d-841e-d173fe654a50&nocache=1557932411907&x_gdpr_f=1&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%2C301x601%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner&auid=540523394%2C540523392%2C540523393%2C540523387&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
173.241.240.220 Amsterdam, Netherlands, ASN (),
Reverse DNS
ox-173-241-240-220.xa.dc.openx.org
Software
OXGW/16.139.0 /
Resource Hash
be9bb0e47a75517ad7436ee0b79ebc78f91da542f35779c49634364e8c081dcf

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
server
OXGW/16.139.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.golem.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
expires
Mon, 26 Jul 1997 05:00:00 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:11 GMT
X-SMRT-D
4%3b21%3b50
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
X-SMRT-D
4%3b17%3b79
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
X-SMRT-D
4%3b1%3b54
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.138.32 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:11 GMT
X-SMRT-D
4%3b2%3b96
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
translator
hbopenbid.pubmatic.com/
0
114 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Wed, 15 May 2019 15:00:12 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
v1
dmx.districtm.io/b/
0
271 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
35.203.66.107 Mountain View, United States, ASN (),
Reverse DNS
107.66.203.35.bc.googleusercontent.com
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Access-Control-Request-Method
POST
Origin
https://www.golem.de
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
server
nginx/1.13.12
access-control-allow-origin
https://www.golem.de
vary
origin
access-control-allow-methods
OPTIONS, POST
status
204
access-control-max-age
14400
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
access-control-allow-headers
origin, content-type
ads
securepubads.g.doubleclick.net/gampad/
51 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4160317506351015&correlator=2601257485263360&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=21061865%2C21062068%2C21063016&vrg=2019050901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-33&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cartikel&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C10x22%7C120x600%7C160x600%7C200x600%7C300x600%2C20x10%7C30x10%7C40x10%7C80x10%7C800x250%7C970x250%7C728x90%7C728x180%7C770x250%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%2C800x450%7C580x500%7C580x360%2C10x10%7C10x11%7C301x250%7C300x126&prev_scp=adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cadslot%3Dbanner%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cush%2Cbb%2Cvidwa%2Cfufrad%7Cadslot%3Drectangle%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cadslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt%7Cadslot%3Drectangle2%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D998cee3ca0eb4d989df876eab0380ec3%26mbrseg%3D3e05b94d%252Cb3838f1f%26nuggad%3Dn3-1%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn70-4%252Cn71-7%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26keywords%3Dsec%252Cinet%252Cdatensicherheit%252Ckeylogger%252Ctsilkcalb%252Citsicherheit%252Cmalware%252Csicherheitsluecke%252Cautormoritztremmel%252Cserver%252Cinternet%252Csecurity%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1557932411&dt=1557932411993&dlt=1557932410758&idt=1077&frm=20&biw=1585&bih=1200&oid=2&adxs=0%2C0%2C0%2C0%2C0&adys=0%2C0%2C0%2C0%2C0&adks=4154185509%2C3506586144%2C2040986986%2C1587276660%2C2621756903&ucis=1%7C2%7C3%7C4%7C5&ifi=1&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&dssz=41&icsg=954214927&std=0&csl=316&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x0%7C1000x0%7C0x0%7C1000x0%7C300x2&blev=1&bisch=1&ga_vid=1778437804.1557932412&ga_sid=1557932412&ga_hid=2086780775&fws=128%2C128%2C128%2C128%2C128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
a7aa1f3c4873cf956867046e3323f46b520c34096610459c6d946bc80a29f15d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-2,-2,-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
7082
x-xss-protection
0
google-lineitem-id
4889676871,4889797896,4889680744,-2,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138267872638,138267578040,138267872656,-2,138267872671
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019050901.js
securepubads.g.doubleclick.net/gpt/
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
93d39da3773a26f38a235454f91d1d2a57a0d9d066c72f9a41452651b08e539e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27443
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-33/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-33/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN (),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

gx-ads.js
ads.golem.de/track.ads/
226 B
594 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=508310844195900&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Sat, 15 Jun 2019 15:00:12 GMT
font-face-1.0.5.css
www.golem.de/staticrl/styles/ Frame 128F
2 KB
729 B
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2302ce8cf6307e809a07b5cd6ba8a546381a971b75fcc2971090154eea40c4f9

Request headers

Referer
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-738"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:12 GMT
minibanner_flat2.css
www.golem.de/microsite/abo/ Frame 128F
2 KB
1 KB
Stylesheet
General
Full URL
https://www.golem.de/microsite/abo/minibanner_flat2.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
14c912652278a80cde809c24f37f3e86754d820ca7c7b2c409af205de7d22d9a

Request headers

Referer
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Last-Modified
Wed, 12 Aug 2015 17:46:08 GMT
Server
nginx
ETag
W/"55cb8660-8d2"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:12 GMT
160622-teaser_4scotty.png
www.golem.de/_img/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/_img/160622-teaser_4scotty.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
02a8df34e2a6941840bd5caa0e5e71a7f5e773768b55c395c2f1d023042c1908

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Wed, 22 Jun 2016 19:41:43 GMT
Server
nginx
ETag
"576ae9f7-580c"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22540
Expires
Sat, 15 Jun 2019 15:00:12 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/
204 KB
76 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
3d5094c1d23b5cf90a1e612d406a1c09b89533c889c287e316aa8ec1da3151f0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
77648
x-xss-protection
0
server
cafe
etag
10849630386184038813
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 May 2019 15:00:12 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/ Frame 81D7
204 KB
76 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
3d5094c1d23b5cf90a1e612d406a1c09b89533c889c287e316aa8ec1da3151f0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
77648
x-xss-protection
0
server
cafe
etag
10849630386184038813
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 May 2019 15:00:12 GMT
display-mit-werbung5.png
www.golem.de/microsite/abo/img/ Frame 128F
984 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/img/display-mit-werbung5.png
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5bca980db62cd62b8af6d7e13a8fca10bcf3275d804a266bac4cd2907e206d2

Request headers

Referer
https://www.golem.de/microsite/abo/minibanner_flat2.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Wed, 12 Aug 2015 17:41:58 GMT
Server
nginx
ETag
"55cb8566-3d8"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
984
Expires
Sat, 15 Jun 2019 15:00:12 GMT
display-ohne-werbung5.png
www.golem.de/microsite/abo/img/ Frame 128F
875 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/img/display-ohne-werbung5.png
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
71561a3bca82f8abb1c48231b9d1a6500aa76c5f3eb838f2ac1dc0c81c5811ae

Request headers

Referer
https://www.golem.de/microsite/abo/minibanner_flat2.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Wed, 12 Aug 2015 17:41:59 GMT
Server
nginx
ETag
"55cb8567-36b"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
875
Expires
Sat, 15 Jun 2019 15:00:12 GMT
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/ Frame 128F
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Sat, 15 Jun 2019 15:00:12 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/ Frame 128F
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Sat, 15 Jun 2019 15:00:12 GMT
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
256 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 09:19:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Sun, 12 May 2019 19:20:24 GMT
server
sffe
age
20423
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=43200
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
125
x-xss-protection
0
expires
Wed, 15 May 2019 21:19:49 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190513/r20190131/ Frame 8F96
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190513/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20190513/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUlgVZMuT85AAL5F1deU73Zs8gK76NHsOdaY8rFE6U93bPU6uKY5a0ApL3Wu
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Mon, 13 May 2019 13:17:50 GMT
expires
Mon, 27 May 2019 13:17:50 GMT
content-type
text/html; charset=UTF-8
etag
7423447574459395779
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6990
x-xss-protection
0
cache-control
public, max-age=1209600
age
178943
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
v1
dmx.districtm.io/b/
0
249 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
35.203.66.107 Mountain View, United States, ASN (),
Reverse DNS
107.66.203.35.bc.googleusercontent.com
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/json

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
server
nginx/1.13.12
status
204
vary
origin
access-control-allow-methods
OPTIONS, POST
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
access-control-allow-headers
origin, content-type
identitystatus
irqs.ioam.de/
25 B
204 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=golem&siteIdentifier=G_SEC&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.08517397813927663
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Alfter, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=001b&i2=001bd24191632e3df5cdc297b&ep=1579429357&vr=414&id=s9k4q...
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=001b&i2=001bd24191632e3df5cdc297b&ep=1579429357&vr=414&id=s9k4q...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=001b&i2=001bd24191632e3df5cdc297b&ep=1579429357&vr=414&id=s9k4qs&i3=001bd24191632e3df5cdc297b%3A1585407612291%3A1557932412291%3A.golem.de%3A1%3Agolem%3AG_SEC%3Anoevent%3A1557932412291%3Ak9ir6d&n1=1&dntt=0&lt=1557932412294&ev=&cs=9op5i&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN (),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 001e
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 001e
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Wed, 15 May 2019 15:00:12 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 001e
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
Location
/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=001b&i2=001bd24191632e3df5cdc297b&ep=1579429357&vr=414&id=s9k4qs&i3=001bd24191632e3df5cdc297b%3A1585407612291%3A1557932412291%3A.golem.de%3A1%3Agolem%3AG_SEC%3Anoevent%3A1557932412291%3Ak9ir6d&n1=1&dntt=0&lt=1557932412294&ev=&cs=9op5i&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Tue, 15 May 2018 15:00:12 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
72 KB
27 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/IjvnOpbzskTW
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.197.186.29 Frankfurt am Main, Germany, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
cdn-eu-15.fra1.do.onthe.io
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:32:01 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5c7d1ac1-11e36"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-15
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Thu, 16 May 2019 12:40:05 GMT
ga.js
www.google-analytics.com/
45 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/ga.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, 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
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 02 May 2019 01:33:03 GMT
server
Golfe2
age
1431
date
Wed, 15 May 2019 14:36:21 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
17168
expires
Wed, 15 May 2019 16:36:21 GMT
146005_67aa4bdf07fc8a6dd839add1ec7302a1
lib.selfcampaign.com/tag/
9 KB
4 KB
Script
General
Full URL
https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
05ee9f210b9b1f0bc4325b1d3979d6e318f94b8d40d85a8d7629b60b2afc4574
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:14 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Server
nginx/1.14.0 (Ubuntu)
Transfer-Encoding
chunked
Content-Type
text/javascript; charset=utf-8
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
X-Runtime
1.356314
Connection
keep-alive
Vary
Accept-Encoding
X-XSS-Protection
1; mode=block
X-Request-Id
616082e2-bf9b-455d-8089-82c598d34332
Expires
Fri, 01 Jan 1990 00:00:00 GMT
rmp-rl_129-min.js
www.golem.de/staticrl/scripts/radiant/
17 KB
7 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmp-rl_129-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b6ecd14c32260d425578d9278b8af4705c9fe9d86980a43bece283fa24e2e91

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Last-Modified
Thu, 09 May 2019 18:51:30 GMT
Server
nginx
ETag
W/"5cd476b2-440d"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:12 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-1e61"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:12 GMT
sp_140505-194704-194702_rc.jpg
www.golem.de/1905/
32 KB
32 KB
Image
General
Full URL
https://www.golem.de/1905/sp_140505-194704-194702_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9b989a4ec9504073a81fda90e33853f122408f4ccfdf93571dd7e80f5d513a7a

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Thu, 02 May 2019 07:17:04 GMT
Server
nginx
ETag
"5cca9970-7e13"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
32275
Expires
Sat, 15 Jun 2019 15:00:12 GMT
sp_140993-194914-194911_rc.jpg
www.golem.de/1905/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1905/sp_140993-194914-194911_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0fbf9416ccb522246292db276304ff1731ae648aa49f96c85f5a98526e85d224

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Fri, 03 May 2019 10:02:06 GMT
Server
nginx
ETag
"5ccc119e-5bd4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23508
Expires
Sat, 15 Jun 2019 15:00:12 GMT
sp_140743-194296-194294_rc.jpg
www.golem.de/1904/
18 KB
19 KB
Image
General
Full URL
https://www.golem.de/1904/sp_140743-194296-194294_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4c0ee9bd341966920fbcf99fc42e339d1ca84893564ca54e9dc2d19b1e8eac2a

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Tue, 30 Apr 2019 07:01:04 GMT
Server
nginx
ETag
"5cc7f2b0-4984"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18820
Expires
Sat, 15 Jun 2019 15:00:12 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=1&aid=141275&page=1&ts=1557932412&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.149 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Wed, 15 May 2019 15:00:12 GMT
Server
Apache
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
cfdeb2e72a2eff788500e423.js
static.plista.com/async/pub/
47 KB
5 KB
Script
General
Full URL
https://static.plista.com/async/pub/cfdeb2e72a2eff788500e423.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
004b67b2a3f963c068d93b3f8e23005f48277c8b61f3d3623da9ce9e6539a456
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 15 May 2019 14:54:29 GMT
server
nginx
age
341
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, must-revalidate, proxy-revalidate
x-varnish
953083708 952454174
accept-ranges
bytes
content-length
4886
via
1.1 varnish-v4
expires
Thu, 16 May 2019 14:54:30 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n3=1&n5=5&n6=2&n7=2&n8=5&n9=0&n10=1&n11=1&n12=6&n17=4&n18=2&n20=2&n21=4&n33=4&n38=2&n39=4&n43=3&n44=3&n46=4&n52=2&n57=3&n58=4&n60=3&n62=3&n67=0&n70=4&n71=7&n75=0&n76=1&n77=0&n78=1&n79=1&n80=0&n81=1&n82=1&n83=0&n84=0&n85=1&n86=0&n87=0&n88=1&n117=2&n118=6&n119=3&n120=2&n121=2&n122=1&n123=2&n127=0&n128=2&n135=9&n15=1&n66=1&n89=2&n90=1&n92=1&n93=3&n94=2&n97=1&n98=1&n99=1&n101=1&n104=1&n106=1&n107=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n153=1&n154=1&n155=1&n156=1&n157=1&n158=1&n159=1&n160=1&n161=1
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
9070e35234f0465cea9be77a4a32290bc99295ecd060fc00b4acff726b2020ff

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1508
sp_305y-420742_rc.jpg
www.golem.de/6249/
68 B
486 B
Image
General
Full URL
https://www.golem.de/6249/sp_305y-420742_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/rmp-rl_129-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.9.109 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:13 GMT
Last-Modified
Wed, 15 May 2019 14:59:20 GMT
Server
AmazonS3
x-amz-request-id
F0707F57A59E933E
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
oIfzNmcetM6hTm5Xx8HBB7xCGhvGRc8810tFa65NWQdsQeCgZ57lVNF6ziMSXe9QIW5SLuc3NDg=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/rmp-rl_129-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-5e9f0"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:12 GMT
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1059675225&utmhn=www.golem.de&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Best%20...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1778437804.1557932412&jid=1353798243&_v=5.7.2&z=1059675225
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1778437804.1557932412&jid=1353798243&_v=5.7.2&z=1059675225
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c08::9b Brussels, Belgium, ASN (),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Wed, 15 May 2019 15:00:12 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Wed, 15 May 2019 15:00:12 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1778437804.1557932412&jid=1353798243&_v=5.7.2&z=1059675225
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
369
expires
Fri, 01 Jan 1990 00:00:00 GMT
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
797
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
796
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=998cee3ca0eb4d989df876eab0380ec3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D998cee3ca0eb4d989df876eab0380ec3%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=998cee3ca0eb4d989df876eab0380ec3&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D998cee3ca0eb4d989df876eab0380ec3%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=998cee3ca0eb4d989df876eab0380ec3&userId=adscale-user:5bab0b02e5f842a59242ac5dfa52c2c9
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=998cee3ca0eb4d989df876eab0380ec3&userId=adscale-user%3A5bab0b02e5f842a59242ac5dfa52c2c9&checkcookies=true
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=998cee3ca0eb4d989df876eab0380ec3&userId=adscale-user%3A5bab0b02e5f842a59242ac5dfa52c2c9&checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:13 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=998cee3ca0eb4d989df876eab0380ec3&userId=adscale-user%3A5bab0b02e5f842a59242ac5dfa52c2c9&checkcookies=true
Date
Wed, 15 May 2019 15:00:13 GMT
Server
nginx
Connection
keep-alive
Content-Length
185
Content-Type
text/plain; charset=utf-8
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=998cee3ca0eb4d989df876eab0380ec3
0
585 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=998cee3ca0eb4d989df876eab0380ec3
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.221 , Netherlands, ASN (),
Reverse DNS
316.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:14 GMT
AN-X-Request-Uuid
e47493d8-a697-4616-921e-526f836044b7
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.50:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=998cee3ca0eb4d989df876eab0380ec3
Date
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=mYzuPKDrTZid-HbqsDgOww
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=mYzuPKDrTZid-HbqsDgOww&google_tc=
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Wed, 15 May 2019 15:00:12 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=998cee3ca0eb4d989df876eab0380ec3
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=998cee3ca0eb4d989df876eab0380ec3
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.20.169.32 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-20-169-32.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Tue, 14 May 2019 15:00:12 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=998cee3ca0eb4d989df876eab0380ec3
Date
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
ads
googleads.g.doubleclick.net/pagead/ Frame C9CC
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=7370415692&adk=795422400&adf=1229236390&w=1000&lmt=1557932412&num_ads=2&guci=1.2.0.0.2.2.0.0&format=1000x120&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&flash=0&wgl=1&adsid=NT&dt=1557932412147&bpp=80&bdt=1389&fdt=471&idt=472&shv=r20190513&cbv=r20190131&saldr=aa&abxe=1&correlator=7081731796741&frm=20&pv=2&ga_vid=1778437804.1557932412&ga_sid=1557932412&ga_hid=2086780775&ga_fc=1&iag=0&icsg=3389671952879360&dssz=64&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=1840&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040081%2C21060853&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=4092314402&ifi=7&uci=7.mdxdn0ykektd&fsb=1&xpc=oaKIZBT4rK&p=https%3A//www.golem.de&dtd=504
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=7370415692&adk=795422400&adf=1229236390&w=1000&lmt=1557932412&num_ads=2&guci=1.2.0.0.2.2.0.0&format=1000x120&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&flash=0&wgl=1&adsid=NT&dt=1557932412147&bpp=80&bdt=1389&fdt=471&idt=472&shv=r20190513&cbv=r20190131&saldr=aa&abxe=1&correlator=7081731796741&frm=20&pv=2&ga_vid=1778437804.1557932412&ga_sid=1557932412&ga_hid=2086780775&ga_fc=1&iag=0&icsg=3389671952879360&dssz=64&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=1840&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040081%2C21060853&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=4092314402&ifi=7&uci=7.mdxdn0ykektd&fsb=1&xpc=oaKIZBT4rK&p=https%3A//www.golem.de&dtd=504
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUlgVZMuT85AAL5F1deU73Zs8gK76NHsOdaY8rFE6U93bPU6uKY5a0ApL3Wu
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Wed, 15 May 2019 15:00:13 GMT
server
cafe
content-length
324
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
osd.js
www.googletagservices.com/activeview/js/current/
76 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190513/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
53af729e9e4b8c8d2aae917515b562dba0d5273acc77c8775d6e05a6cddfcefd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1557761362186258"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28615
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
288 B
946 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/rmp-rl_129-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.32.223.37 Seattle, United States, ASN (),
Reverse DNS
server-13-32-223-37.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:12 GMT
Via
1.1 5d4ff22febf83d261f03aa068f5bdc04.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
288
Last-Modified
Tue, 30 Apr 2019 15:43:40 GMT
Server
AmazonS3
ETag
"54c7dbe42d2e906013c324c59a35e181"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
qesTjuXwtfbxjvpZI34jepPZGEE1QsPZJtqXElDvM79CiXyprBtGAw==
Expires
0
5a9fe1dae45a1d155411456a.js
insights.plista.com/app/5a/9f/e1/
53 KB
19 KB
Script
General
Full URL
https://insights.plista.com/app/5a/9f/e1/5a9fe1dae45a1d155411456a.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async/pub/cfdeb2e72a2eff788500e423.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN (),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
13b219900bd84f484766a5a90357d312a6583a41591452752da8c9c12cc662b6

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
last-modified
Tue, 09 Apr 2019 09:39:18 GMT
server
NetDNA-cache/2.2
etag
W/"d219-58615ba1a52aa"
vary
Accept-Encoding
x-cache
HIT
content-type
application/javascript
status
200
cache-control
max-age=1800
expires
Wed, 15 May 2019 15:25:49 GMT
async_lib.js
farm.plista.com/
32 KB
11 KB
Script
General
Full URL
https://farm.plista.com/async_lib.js?json=%7B%22name%22%3A%22PLISTA_%5B0%5D%22%2C%22publickey%22%3A%22cfdeb2e72a2eff788500e423%22%2C%22objectid%22%3A%22141275%22%2C%22rev%22%3A1555494349%2C%22req%22%3A%5B%5B%22isarticle%22%5D%2C%5B%22widgetload%22%2C%7B%22widgets%22%3A%5B%22underArticle%22%5D%2C%22ab%22%3A0%2C%22vo%22%3Atrue%2C%22pm%22%3Atrue%2C%22sc%22%3A%221600x1200%22%2C%22px%22%3A1%2C%22vs%22%3A%220.6.12%22%2C%22vp%22%3Atrue%2C%22ww%22%3A1600%2C%22wb%22%3Atrue%7D%5D%5D%7D&x=1557932412688
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a01:4f8:202:42d4::2 Schriesheim, Germany, ASN (),
Reverse DNS
Software
nginx /
Resource Hash
9832c7692ea71e529df162815044411cbe911b4dad62ce20a6a016e0e6a5abba

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
last-modified
Wed, 15 May 2019 15:00:12 GMT
server
nginx
p3p
policyref="https://www.plista.com/w3c/p3p.xml", CP="CAO DSP COR TAIa PSAa PSDa IVAi IVDi CONi HISa OUR IND PHY ONL UNI COM NAV INT DEM STA PRE"
status
200
cache-control
no-cache, must-revalidate
content-type
application/javascript; charset=utf-8
content-length
10308
expires
Mon, 26 Jul 1997 05:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 7AEC
0
75 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssPvlxmnhQbruRzJv6IzJKk_ofpuoDxA8u3ZSeW_X6D1Uwd165HkGfVUGrLXFM21ESVK0W93CuNnjx3B4jRmoaXcNA8eRvmXgIDvsQ4Tse7NfMnK6D_NK6sslarTJ3hIpDqXfqXHrxAXbE8J4fAYalOIlHGBzmNVWCSMG49Yonfvr25TWe9BD0Iwg3kA85KFlAvTR-UZe_qMYS5IeVmRj7Qd9L-KD7yrm6KuTvEq2d7edi8Ku6X6M7-Cs0iLsOOX9Z0nAqcbaEyI0rMj937&sai=AMfl-YTWHctKtQrGjDx7IbZbzDph8Bq9wUAnB5LRlTphtDNdqye6UO8GHCZCPk6ngGNZx9pYhM2rOTNxBxpDTL9JwDl9swctQuDBH0rN0_szEQ&sig=Cg0ArKJSzK71JjJA_HucEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 15 May 2019 15:00:12 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame 7AEC
31 KB
10 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3e8dadf2162e744a31d12d4935c7986dbc5c519a6829807c7582411c7972dc6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"166 / 809 of 1000 / last-modified: 1557857174"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10550
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 7AEC
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
58d5d69efb99ba86b86e44a4753304d14f0ebcda68e3b9b31faa68d85d2a9811
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1557761362186258"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28693
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame ED74
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssELsb7IjNmruGbXTrNzGloo6P0xvqWYkU2J9ffsJ_MQO3ffsUMBEoyAT52Md1czQ7eBbJUvjOjwNdPlrsmMRnLWFVcpbc38g9A3LWh4htsd_h6Mdi1POfgCbdIpIbK6CKVZ0g0FiSsRd7A9z6nw-YDyzTU3YSp5YO_iuwvhaF6CD-pEt8jbhc6wN6rxAJoo0CiekbV8u_PcOh7BnWafaGmemF15EUmKVmq_Mzwbaf1XDjT6_JDD0lmheUE9JR9z4IDXA7okC35KSGOFQRY&sai=AMfl-YSXmyemNaJxNWPj1GvJHy1YcTd0MnuEX79Bp-jtYjxsTlsXRhQCj2g3_US07x7WadlaBL9bHfhHwCwyH_F2N00PGp7-dh7CPFC7vKl8ag&sig=Cg0ArKJSzJeVq-qFArwmEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 15 May 2019 15:00:12 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame ED74
31 KB
10 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3e8dadf2162e744a31d12d4935c7986dbc5c519a6829807c7582411c7972dc6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"166 / 135 of 1000 / last-modified: 1557857174"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10550
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame ED74
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
58d5d69efb99ba86b86e44a4753304d14f0ebcda68e3b9b31faa68d85d2a9811
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1557761362186258"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28693
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 9ED3
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst_XGrvk9zI29XXiZMTLIo6qWSMLTWgztLiK9UKMhDi111KPJ8GR0p3LDpUCUda9uaq7ZJNG7hMyKOS8ZIOhcBVh5psWXZ8e9TJWYsKEWtOLGPQOcZGTlHJ5yj7u3MYRmnoEVFH_jM4xwNnIAgDSC6EeoUcp7eZqzHWaHEeVfzWtQB5V7gnwMLWgIe85ipu0kBevnkOTvsbNsbBTRPsAEh2FMmpOM9SCkLEBCisnb1NebGEkQTXBC2nxHyMCyvIZ1PH4SPFzNTFDVyutx7Q&sai=AMfl-YTkgPfvCynT_ec4kUygmYYBTNYmES9yswlR8WhmDlarF2Z6Bi2Ow5QkLigkmdfdwcztjYLKktnIlMKvF6hdh8s2limlUSB59ZvsWaplsA&sig=Cg0ArKJSzKM10vvE0hqxEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 15 May 2019 15:00:12 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame 9ED3
31 KB
10 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3e8dadf2162e744a31d12d4935c7986dbc5c519a6829807c7582411c7972dc6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"166 / 179 of 1000 / last-modified: 1557857174"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10550
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 9ED3
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
58d5d69efb99ba86b86e44a4753304d14f0ebcda68e3b9b31faa68d85d2a9811
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1557761362186258"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28693
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame D535
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuXueoJv5m44ZfpQP6bYn5giMM30T2Np-cWQtjCDkhQAjjar4tOYa3d_H0cTZdWLezatCWm0dBVepurESrksEAutd4BX1RKtRpzrTvzKJ3r6NAHFfM8NzeA-ALPwSwW7LhCJ4lM5Kky0z3UDHPUEihRiNenoHYV-lQ6rTIANxSGRx5cBCtI5nWWfbxUs_UW8h95wDcKneu7slKLoZgGr0PR3psnD4IOSHLyQgoGa6yrx9YQaCLHJzjGu3nsSJLmS91O1guFvcNeYfLiXEFN&sai=AMfl-YRABWZNqDrNZvMx1Qty2dwiGoOSVuFs7Bb9tnYIptX4c4LITNbElFNj2b7giIT_mCIbsX0ytqmzC8ZH0mLV3YgUxDVlPxagGQJ46prwBA&sig=Cg0ArKJSzJ-RhLslPUBxEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 15 May 2019 15:00:12 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
gpt.js
www.googletagservices.com/tag/js/ Frame D535
31 KB
10 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3e8dadf2162e744a31d12d4935c7986dbc5c519a6829807c7582411c7972dc6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"166 / 793 of 1000 / last-modified: 1557857174"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10550
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame D535
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
58d5d69efb99ba86b86e44a4753304d14f0ebcda68e3b9b31faa68d85d2a9811
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1557761362186258"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28693
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:12 GMT
sp_305y-150589_rc.jpg
www.golem.de/3509/adfeedback/
68 B
486 B
Image
General
Full URL
https://www.golem.de/3509/adfeedback/sp_305y-150589_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
sp_305y-336955_rc.jpg
www.golem.de/2643/adfeedback/
68 B
486 B
Image
General
Full URL
https://www.golem.de/2643/adfeedback/sp_305y-336955_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:12 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html,page:Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,article_layout:default,category:news,type_article:shortread,pub_date:15%20May%202019%2016%3A15%3A00%20CEST,reference_time:98,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:f68514c6f.58940fb51_1557932412895,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1557932412902
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:13 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/uniques/
33 B
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=15&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=f68514c6f.58940fb51_1557932412895&1557932412906
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:13 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html,page:Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,article_layout:default,category:news,type_article:shortread,pub_date:15%20May%202019%2016%3A15%3A00%20CEST,reference_time:98,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:f68514c6f.58940fb51_1557932412895,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=f68514c6f.58940fb51_1557932412895&1557932412917
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:13 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html,page:Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,article_layout:default,category:news,type_article:shortread,pub_date:15%20May%202019%2016%3A15%3A00%20CEST,reference_time:98,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:f68514c6f.58940fb51_1557932412895,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1557932412924
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:13 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
211 KB
57 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=VmQyjioNZl
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/rmp-rl_129-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.32.223.215 Seattle, United States, ASN (),
Reverse DNS
server-13-32-223-215.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5d6c44d5980f3c680724df4abe386d27d13c519f4ffa1262dc6e649b32f6a5d8

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 14:59:58 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
60
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Tue, 14 May 2019 14:38:58 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 7a04ed7b69e0edefa91e397390fa9ad0.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
QCdojTwB-AgPVoRXRfXsl5-BkbsWhTjIiWg8VOuGgJGDbeit-Rkg2g==
p
insights.plista.com/
0
66 B
Image
General
Full URL
https://insights.plista.com/p?i=5a9fe1dae45a1d155411456a&r=&sr=&mt=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&ma=-1&tg=-1&ctg=-1&mp=-1&mu=-1&mi=https%3A%2F%2Fwww.golem.de%2F1905%2F141275-196128-196126_rc.jpg&md=Eigentlich%20soll%20das%20Best-of-the-Web-Siegel%20die%20Sicherheit%20von%20Webseiten%20zertifizieren%2C%20stattdessen%20wurden%20%C3%BCber%20ein%20gehacktes%20Script%20Keylogger%20eingebunden.&or=-1&wc=-1&pw=&pwu=0&co=0&il=&hv=&sc=-1&p=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&c=desktop&t=article&s=&_r=1557932413066:4.7.12:20190409-113831
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN (),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
204
date
Wed, 15 May 2019 15:00:13 GMT
server
NetDNA-cache/2.2
x-cache
MISS
pubads_impl_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame 7AEC
150 KB
55 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
a161cba4b2b8a90e2ca19e935256925fa3920b6ed129ec1568fccbd1a290b1b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
55799
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:13 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 7AEC
113 B
178 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
pubads_impl_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame ED74
150 KB
55 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
a161cba4b2b8a90e2ca19e935256925fa3920b6ed129ec1568fccbd1a290b1b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
55799
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:13 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame ED74
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
1.png
static.plista.com/image/adchoices/de/13/119,119,119/0/
1 KB
1 KB
Image
General
Full URL
https://static.plista.com/image/adchoices/de/13/119,119,119/0/1.png
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
76ceb9b46c9787fba45d74064ac8e7ea819b8cfe3060d11a0c9cea3706f4575f

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
last-modified
Wed, 15 May 2019 14:43:53 GMT
server
nginx
age
979
content-type
Content-type: image/png; charset=utf-8
status
200
cache-control
public, must-revalidate, proxy-revalidate
x-varnish
952432089 952091238
accept-ranges
bytes
content-length
1148
expires
Fri, 14 Jun 2019 14:43:54 GMT
trk.js
cdn.adnxs.com/v/s/162/
80 KB
30 KB
Script
General
Full URL
https://cdn.adnxs.com/v/s/162/trk.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.121.108 Paris, France, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
585cc11b4d20958229b3e7f944f3c7d616e947fdf93777fdee3bae2b3da47207

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:13 GMT
Content-Encoding
gzip
Age
2963751
X-Cache
HIT, HIT
X-Cache-Hits
1, 3478755
Connection
keep-alive
Content-Length
30115
Via
1.1 varnish, 1.1 varnish
X-Served-By
cache-jfk8126-JFK, cache-cdg20780-CDG
Last-Modified
Thu, 11 Apr 2019 07:33:08 GMT
Server
Apache
Cache-Control
max-age=31536000
X-Timer
S1557932413.367282,VS0,VE0
ETag
"41c9cba9146dc2b11581787d690f54a1:1554967990"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*, *
Fastly-Debug-Digest
df7da41614d72a8e6eaa4710ddee5477ec8337a3f77c397da0c440d282fd83dd
Accept-Ranges
bytes
Expires
Fri, 10 Apr 2020 07:44:22 GMT
vcdn.adnxs.com%2Fp%2Fcreative-image%2F84%2F3e%2F46%2F46%2F843e4646-2a1d-4738-8c44-a7465c039942.jpg
media.plista.com/Pst0ZbX4FXnvq8PDckr8gHdD5ks=/320x180/filters:format(webp):quality(85)/
22 KB
22 KB
Image
General
Full URL
https://media.plista.com/Pst0ZbX4FXnvq8PDckr8gHdD5ks=/320x180/filters:format(webp):quality(85)/vcdn.adnxs.com%2Fp%2Fcreative-image%2F84%2F3e%2F46%2F46%2F843e4646-2a1d-4738-8c44-a7465c039942.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN (),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
46c74c2d8d78fcba820e298bc02dca4153e794d98367799240ae49340c627e47

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
server
NetDNA-cache/2.2
etag
"eeffc0f8729889d759cd6f7c1dc2a0888929d71b"
x-cache
HIT
content-type
image/webp
status
200
cache-control
max-age=2592000,public
content-length
22308
expires
Tue, 11 Jun 2019 22:49:18 GMT
3902.jpg
static.plista.com/imageserver/c/3318/141228/320/180/
3 KB
3 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/141228/320/180/3902.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
66f800ffe97e28c9141b4b3bfd12f5cc5d3ab3aeb268c91603096130b4c3a843

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
server
nginx
age
85355
x-varnish
953664265 860639207
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
3192
expires
Thu, 13 Jun 2019 15:17:37 GMT
fRhdm5Dvh2e085N_320x180_8282.jpeg
static.plista.com/image/resized/c/34885/
17 KB
17 KB
Image
General
Full URL
https://static.plista.com/image/resized/c/34885/fRhdm5Dvh2e085N_320x180_8282.jpeg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
f93b78838680ebc6e776cda71019b65bd1e752224d2df0940d7361544bfcbb6e

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
server
nginx
age
193
x-varnish
954633761 952269415
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
17345
expires
Fri, 14 Jun 2019 14:56:59 GMT
3900.jpg
static.plista.com/imageserver/c/3318/141205/320/180/
11 KB
12 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/141205/320/180/3900.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
6a1cf4449f7e36f0be6c7109311442b030b10fc4cdaafa0d2f94b11423c8aacc

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
server
nginx
age
26531
x-varnish
952432095 915623842
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
11675
expires
Fri, 14 Jun 2019 07:38:01 GMT
3927.jpg
static.plista.com/imageserver/c/3318/141248/320/180/
17 KB
17 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/141248/320/180/3927.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
c310ae4c86fb59bf152d1d49816b8fe9d9c9122ce81d3bb99d4c9e3d7ec152cc

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
server
nginx
age
63171
x-varnish
954666254 891952772
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
17524
expires
Thu, 13 Jun 2019 21:27:21 GMT
vcdn.adnxs.com%2Fp%2Fcreative-image%2Fb6%2F3b%2Fec%2F2d%2Fb63bec2d-e83d-47bd-bfe2-ff1799b65ff4.png
media.plista.com/-X7IVqNwQlIQ9ndbJUPogD6HRbs=/320x180/filters:format(webp):quality(85)/
14 KB
14 KB
Image
General
Full URL
https://media.plista.com/-X7IVqNwQlIQ9ndbJUPogD6HRbs=/320x180/filters:format(webp):quality(85)/vcdn.adnxs.com%2Fp%2Fcreative-image%2Fb6%2F3b%2Fec%2F2d%2Fb63bec2d-e83d-47bd-bfe2-ff1799b65ff4.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN (),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
4899bc9c6099f173d8b3df16a0b6ec888d53c5b5080aa2060dc1a0f86f83e061

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
server
NetDNA-cache/2.2
etag
"e2cfca633bd4b29944383de19526c3292413da15"
x-cache
HIT
content-type
image/webp
status
200
cache-control
max-age=2592000,public
content-length
13966
expires
Mon, 27 May 2019 22:00:47 GMT
3901.jpg
static.plista.com/imageserver/c/3318/141231/320/180/
8 KB
8 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/141231/320/180/3901.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
46ae27a8ec9d2d449324e27f6f4827b2f33d39cfea194bf9ea31c48b8a4cf78f

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
server
nginx
age
77162
x-varnish
953083756 873499576
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
8239
expires
Thu, 13 Jun 2019 17:34:10 GMT
vcdn.adnxs.com%2Fp%2Fcreative-image%2F1f%2Ff3%2F1e%2Fb2%2F1ff31eb2-3b8b-4daf-a2b7-5af2016010f5.jpeg
media.plista.com/VehHIQaNHmNjifHcP4m7Ai5zWeg=/320x180/filters:format(webp):quality(85)/
15 KB
15 KB
Image
General
Full URL
https://media.plista.com/VehHIQaNHmNjifHcP4m7Ai5zWeg=/320x180/filters:format(webp):quality(85)/vcdn.adnxs.com%2Fp%2Fcreative-image%2F1f%2Ff3%2F1e%2Fb2%2F1ff31eb2-3b8b-4daf-a2b7-5af2016010f5.jpeg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN (),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
3cf807f67ce81c36350ad1d8cf93a17311c476af13ff496280b8b2a5ef35ebf2

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
server
NetDNA-cache/2.2
etag
"1e6d6110b0ed790993cdf87d2828525099ef01f9"
x-cache
HIT
content-type
image/webp
status
200
cache-control
max-age=2592000,public
content-length
15050
expires
Sun, 26 May 2019 17:14:42 GMT
logo_plista_small_AAAAAA.png
static.plista.com/image/
496 B
698 B
Image
General
Full URL
https://static.plista.com/image/logo_plista_small_AAAAAA.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.126.14 Ratingen, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.14.126.201.138.clients.your-server.de
Software
nginx /
Resource Hash
344786bb832a52e0a121dee0945e4b7a97b448ea89d7ce9fc0846841b4338110

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
via
1.1 varnish-v4
server
nginx
age
1053
x-varnish
954763489 951168105
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
Content-type: image/png; charset=utf-8
content-length
496
expires
Fri, 14 Jun 2019 14:42:39 GMT
it
fra1-ib.adnxs.com/
0
658 B
Image
General
Full URL
https://fra1-ib.adnxs.com/it?an_audit=0&referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&e=wqT_3QL5CPBDeQQAAAMA1gAFAQj-0vDmBRDBwJ-9972zwnwY-vKV2Y26jtt3KjYJ_Bhz1xLy2T8R_Bhz1xLy2T8ZAAAAYGZmCEAh_BgJGwApESTwyTEAAADAHoXrPzCK44EGOOsbQOsbSAJQhobCS1jum1hgAGjUy3x49ZMFgAEBigEDVVNEkgEDRVVSmAEBoAEBqAEBsAEAuAECwAEEyAEC0AEJ2AEA4AEA8AEAigKUAXVmKCdhJywgMjYzOTAwNiwgMTU1NzkzMjQxNCk7dWYoJ2knLCAxMjI1NjQyLCAxNTU3OTMyNDE0KTt1ZignZycsIDc5NzUwMzQsIDE1NTc5MzI0MTQpO3VmKCdjJywgMjk1NzU5OTEsIDE1NTcuWAAwcicsIDE1ODM2ODUxOAELADUVPfR1AZIC6QIhMjFMeXN3aTNsbzBPRUlhR3drc1lBQ0R1bTFnd0JEZ0FRQVJJNnh0UWl1T0JCbGdBWVBfX19fOFBhQUJ3QVhnQmdBRUJpQUVCa0FFQm1BRUJvQUVRcUFFS3NBRUF1UUZyUkp4MktSN1hQOEVCS2ZjaURBTHkyVF9KQVFBQUFJQndjZTBfMlFFWG53SmdQSVBzUC1BQnF1ZEs5UUVBQUhwRWdBSUJpQUxTdXBrSGlBS2hxQ3VRQWdHUUFnR1lBZ0NnQWdTb0FnR29BZ0cxQWdBQUFBQzlBZ0FBQURfQUFnSElBZ0hRQWdIWUFnSGdBZ0RvQWdENEFnQ0FBd0dZQXdHaUF3NEltZmVIQmhBRUdBRXRkUXVqT3FJREV3alc3NEVHRUFvWUFTMkVpMnNfTWdOMWJtdW9BN2VXalE2NkF3bEdVa0V4T2pReE5EWGdBLW9MZ0FURG1aSUNpQVRMbVpJQ2tBUUFtQVFCmgJhIVBnX3RoOmwBLDdwdFlJQVFvQURFQQkBiER3UHpvSlJsSkJNVG8wTVRRMVFPb0xTUmVmQW1BOGctd19VITwNAQBXHQz0NAHYAuaTAeACmJNG6gJaaHR0cHM6Ly93d3cuZ29sZW0uZGUvbmV3cy9iZXN0LW9mLXRoZS13ZWItdHJ1c3Qtc2llZ2VsLXZlcnRlaWx0LWtleWxvZ2dlci0xOTA1LTE0MTI3NS5odG1sgAMBiAMBkAMAmAMUoAMBqgMAwAPgqAHIAwDYA964KOADAOgDAPgDA4AEAJIECS9vcGVucnRiMpgEAKgEALIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDjM1NjMjRlJBMTo0MTQ12gQCCAHgBADwBIaGwkuIBQGYBQCgBf___________wGqBREzNDcwNDUyMjY0NjY0NDU3NMAFAMkFAAAAAAAA8D_SBQkJAAAAAAAAAADYBQHgBQHwBTb6BQQIABAAkAYBmAYAuAYAwQYRLxzIBgDaBhYKEAkQGQE4EAAYAOAGDPIGAggAgAcB&s=c47173293cf676571aa6c2d5027c91241581004a&pp=0.3908631566594493
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.249 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
534.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
AN-X-Request-Uuid
ec4f4064-e893-4e40-9a9e-d101aadf1e18
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 534.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.184:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
it
fra1-ib.adnxs.com/
0
658 B
Image
General
Full URL
https://fra1-ib.adnxs.com/it?an_audit=0&referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&e=wqT_3QL3CPBDdwQAAAMA1gAFAQj-0vDmBRD4v_6sz_ia0AsY-vKV2Y26jtt3KjYJF30Facai1T8RF30Facai1T8ZAAAAYGZmCEAhF30JGwApESTwyTEAAADAHoXrPzCK44EGOOsbQOsbSAJQ2eirSFjum1hgAGjUy3x49ZMFgAEBigEDVVNEkgEDRVVSmAEBoAEBqAEBsAEAuAECwAEEyAEC0AEJ2AEA4AEA8AEAigKUAXVmKCdhJywgMzE2Mzk4NCwgMTU1NzkzMjQxNCk7dWYoJ2knLCAxMDg5OTM0LCAxNTU3OTMyNDE0KTt1ZignZycsIDc2MzQ3NjksIDE1NTc5MzI0MTQpO3VmKCdjJywgMjgyOTM1NzgsIDE1NTcuWAAwcicsIDE1MTcxMjg1NwELADUVPfR1AZIC5QIhcmxVTTNnaks4NzRORU5ub3EwZ1lBQ0R1bTFnd0JEZ0FRQVJJNnh0UWl1T0JCbGdBWVBfX19fOFBhQUJ3QVhnQmdBRUJpQUVCa0FFQm1BRUJvQUVRcUFFS3NBRUF1UUhZMmo5YklFZlRQOEVCTzQzejhieWkxVF9KQVFBQUFNQ1BYUEFfMlFFWG53SmdQSVBzUC1BQmpzTkM5UUVBQUQ1RG1BSUFvQUlFdFFJQUFBQUF2UUlBQUFBX3dBSUJ5QUlCMEFJQjJBSUI0QUlBNkFJQS1BSUFnQU1CbUFNQm9nTVVDSV8yMHdVUUFoZ0JMUUFBQUFBeUJHTnpYeldpQXc0SWp1YUhCaEFFR0FFdDVUTkxPcUlERXdpcXZvTUdFQW9ZQVMxLTVJSV9NZ04xYm11b0E4cnp2ZzI2QXdsR1VrRXhPalF4TkRYZ0Etb0xnQVQteFBjQmlBUzBxZjRCa0FRQm1BUUKaAmEhT2hPY1Znaks4PWjQN3B0WUlBUW9BREZTdUI2RjYxSElQem9KUmxKQk1UbzBNVFExUU9vTFNSZWZBbUE4Zy13X1UhOA0BAFcdDPRIAdgC5pMB4AKYk0bqAlpodHRwczovL3d3dy5nb2xlbS5kZS9uZXdzL2Jlc3Qtb2YtdGhlLXdlYi10cnVzdC1zaWVnZWwtdmVydGVpbHQta2V5bG9nZ2VyLTE5MDUtMTQxMjc1Lmh0bWyAAwGIAwGQAwCYAxSgAwGqAwDAA-CoAcgDANgD3rgo4AMA6AMA-AMDgAQAkgQJL29wZW5ydGIymAQAqAQAsgQMCAAQABgAIAAwADgAuAQAwAQAyAQA0gQOMzU2MyNGUkExOjQxNDXaBAIIAeAEAPAE2eirSIgFAZgFAKAF____________AaoFETM0NzA0NTIyNjQ2NjQ0NTc0wAUAyQUAAAAAAADwP9IFCQkAAAAAAAAAANgFAeAFAfAF0sYf-gUECAAQAJAGAZgGALgGAMEGAAAAAAAA8D_IBgDaBhYKEAAACUMRATgQABgA4AYM8gYCCACABwE.&s=31bd6e1c2bd6e49520a173f71e7146402538625f&pp=0.230424
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.249 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
534.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
AN-X-Request-Uuid
9a8373da-1975-4142-b6f1-c50c79d3ad68
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 534.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.165:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
it
fra1-ib.adnxs.com/
0
658 B
Image
General
Full URL
https://fra1-ib.adnxs.com/it?an_audit=0&referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&e=wqT_3QKUCfBMlAQAAAMA1gAFAQj-0vDmBRCQsaeVh8SP1w0Y-vKV2Y26jtt3KjYJmN2Th4Va0T8RJqWHPqsOzD8ZAAAAYGZmCEAhJqWHPqsOzD8pmN0JJPCVMQAAAMAehes_MIrjgQY46xtAtDhIAlDw__k4WO6bWGAAaNTLfHj1kwWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQXIAQLQAQnYAQDgAQDwAQCKApMBdWYoJ2EnLCAxMzQwMjQyLCAxNTU3OTMyNDE0KTt1ZignaScsIDkxNTg5OSwgMTU1NzkzMjQxNCk7ARwkZycsIDc3MDg5MEodADRjJywgMjg1MTU1MDEsID5XAAByAXQcMTk0MzkzNDQ2HwD0jgGSAoEDITdWaEVTd2lydWN3TkVQRF8tVGdZQUNEdW0xZ3dCRGdBUUFCSXREaFFpdU9CQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFU3FBRUJzQUVBdVFIekhUdGUydXpPUDhFQkoyeXBKNVJhMFRfSkFRQUFBQUFBQVBBXzJRRVhud0pnUElQc1AtQUJ1X00zOVFITFpuYy1nQUlBaUFLcnhaUURpQUt5eFpRRGtBSUNtQUlBb0FJQnFBSUN0UUlBQUFBQXZRSUFBQUFBd0FJQnlBSUIwQUlCMkFJQjRBSUE2QUlBLUFJQWdBTUJtQU1Cb2dNT0NQdloyd1VRQVJnQ0xRQUFnRC1pQXhVSXpPUGJCUkFDR0FFdEFBQUFBRElGWTNOZk1UR2lBdzRJLTluYkJSQUxHQUl0QUFDQVA2Z0RyYm5NRGJvRENVWlNRVEU2TkRRek4tQUQ2Z3VBQktIcmlnS0lCS1hyaWdLUUJBR1lCQUdnQkFvLpoCYSFhdy1acVE2hAEoN3B0WUlBQW9BREUhJgkBfERvSlJsSkJNVG8wTkRNM1FPb0xTUmVmQW1BOGctd19VMVQMQUFBVx0M9EgB2ALmkwHgApiTRuoCWmh0dHBzOi8vd3d3LmdvbGVtLmRlL25ld3MvYmVzdC1vZi10aGUtd2ViLXRydXN0LXNpZWdlbC12ZXJ0ZWlsdC1rZXlsb2dnZXItMTkwNS0xNDEyNzUuaHRtbIADAYgDAZADteodmAMUoAMBqgMAwAPgqAHIAwDYA964KOADAOgDAPgDA4AEAJIECS9vcGVucnRiMpgEAKgEALIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDjcyMjAjRlJBMTo0NDM32gQCCAHgBADwBPD_-TiIBQGYBQCgBf___________wGqBREzNDcwNDUyMjY0NjY0NDU3NMAFAMkFAAAAAAAA8D_SBQkJAAAAAAAAAADYBQHgBQHwBc6bAfoFBAgAEACQBgGYBgC4BgDBBgAAAAAAAPA_yAYA2gYWChABMS4BADgQABgA4AYM8gYCCACABwE.&s=8f018467d560343d20bf33c2fa21c462d838c727&pp=0.16839
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.249 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
534.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
AN-X-Request-Uuid
6c064ce0-8728-407a-aa04-520d40639e7d
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 534.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.136:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
farm.plista.com/matching/pixel/
Redirect Chain
  • https://secure.adnxs.com/getuid?https%3A%2F%2Ffarm.plista.com%2Fmatching%2Fpixel%2F%3Fssp%3Dc3de%26dsp_user_id%3D$UID
  • https://secure.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Ffarm.plista.com%252Fmatching%252Fpixel%252F%253Fssp%253Dc3de%2526dsp_user_id%253D%24UID
  • https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=3494082633592885914
35 B
385 B
Image
General
Full URL
https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=3494082633592885914
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a01:4f8:202:42d4::2 Schriesheim, Germany, ASN (),
Reverse DNS
Software
nginx /
Resource Hash
6a842ea462daca2a0b5a0f5f25bcfc8e0059ac811ca6c6a1bc54e4d9119621c3

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
server
nginx
p3p
policyref="https://www.plista.com/w3c/p3p.xml", CP="CAO DSP COR TAIa PSAa PSDa IVAi IVDi CONi HISa OUR IND PHY ONL UNI COM NAV INT DEM STA PRE"
content-length
51
content-type
image/gif

Redirect headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
AN-X-Request-Uuid
2b30b123-d303-4c55-805d-a6eb505f40fc
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
Location
https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=3494082633592885914
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 537.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.187:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
pubads_impl_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame 9ED3
150 KB
55 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
a161cba4b2b8a90e2ca19e935256925fa3920b6ed129ec1568fccbd1a290b1b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
55799
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:13 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 9ED3
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
pubads_impl_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame D535
150 KB
55 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
a161cba4b2b8a90e2ca19e935256925fa3920b6ed129ec1568fccbd1a290b1b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
55799
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:13 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame D535
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
truncated
/
211 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5d6c44d5980f3c680724df4abe386d27d13c519f4ffa1262dc6e649b32f6a5d8

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
text/javascript
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
5 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=432759
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:30::6818:6724 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
a1143eb79f86618f8a72788f8f9f8e5884797dbd12e6d0a7c212f46c1dd1e525
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
cf-ray
4d75faf42e769ab6-FRA
status
200
last-modified
Tue, 14 May 2019 09:23:00 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=3600
timing-allow-origin
*
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Wed, 15 May 2019 16:00:14 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:14 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 15 Jun 2019 15:00:14 GMT
vevent
fra1-ib.adnxs.com/
0
809 B
Other
General
Full URL
https://fra1-ib.adnxs.com/vevent?an_audit=0&referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&e=wqT_3QLNCfBDzQQAAAMA1gAFAQj-0vDmBRDBwJ-9972zwnwY-vKV2Y26jtt3KjYJ_Bhz1xLy2T8R_Bhz1xLy2T8ZAAAAYGZmCEAh_BgJGwApESTwyTEAAADAHoXrPzCK44EGOOsbQOsbSAJQhobCS1jum1hgAGjUy3x49ZMFgAEBigEDVVNEkgEDRVVSmAEBoAEBqAEBsAEAuAECwAEEyAEC0AEJ2AEA4AEA8AEAigKUAXVmKCdhJywgMjYzOTAwNiwgMTU1NzkzMjQxNCk7dWYoJ2knLCAxMjI1NjQyLCAxNTU3OTMyNDE0KTt1ZignZycsIDc5NzUwMzQsIDE1NTc5MzI0MTQpO3VmKCdjJywgMjk1NzU5OTEsIDE1NTcuWAAwcicsIDE1ODM2ODUxOAELADUVPfR1AZIC6QIhMjFMeXN3aTNsbzBPRUlhR3drc1lBQ0R1bTFnd0JEZ0FRQVJJNnh0UWl1T0JCbGdBWVBfX19fOFBhQUJ3QVhnQmdBRUJpQUVCa0FFQm1BRUJvQUVRcUFFS3NBRUF1UUZyUkp4MktSN1hQOEVCS2ZjaURBTHkyVF9KQVFBQUFJQndjZTBfMlFFWG53SmdQSVBzUC1BQnF1ZEs5UUVBQUhwRWdBSUJpQUxTdXBrSGlBS2hxQ3VRQWdHUUFnR1lBZ0NnQWdTb0FnR29BZ0cxQWdBQUFBQzlBZ0FBQURfQUFnSElBZ0hRQWdIWUFnSGdBZ0RvQWdENEFnQ0FBd0dZQXdHaUF3NEltZmVIQmhBRUdBRXRkUXVqT3FJREV3alc3NEVHRUFvWUFTMkVpMnNfTWdOMWJtdW9BN2VXalE2NkF3bEdVa0V4T2pReE5EWGdBLW9MZ0FURG1aSUNpQVRMbVpJQ2tBUUFtQVFCmgJhIVBnX3RoOmwBLDdwdFlJQVFvQURFQQkBiER3UHpvSlJsSkJNVG8wTVRRMVFPb0xTUmVmQW1BOGctd19VITwNAQBXHQzwpNgC5pMB4AKYk0bqAlpodHRwczovL3d3dy5nb2xlbS5kZS9uZXdzL2Jlc3Qtb2YtdGhlLXdlYi10cnVzdC1zaWVnZWwtdmVydGVpbHQta2V5bG9nZ2VyLTE5MDUtMTQxMjc1Lmh0bWzyAhMKD0NVU1RPTV9NT0RFTF9JRBIA8gIaChZDVVNUT01fTU9ERUxfTEVBRl9OQU1FEgDyAh4KGkNVU1RPTQ0zDExBU1QBC_QDAUlGSUVEEgCAAwGIAwGQAwCYAxSgAwGqAwDAA-CoAcgDANgD3rgo4AMA6AMA-AMDgAQAkgQJL29wZW5ydGIymAQAqAQAsgQMCAAQABgAIAAwADgAuAQAwAQAyAQA0gQOMzU2MyNGUkExOjQxNDXaBAIIAeAEAPAEhobCS4gFAZgFAKAF____________AaoFETM0NzA0NTIyNjQ2NjQ0NTc0wAUAyQUAAAAAAADwP9IFCQkAAAAAAAAAANgFAeAFAfAFNvoFBAgAEACQBgGYBgC4BgDBBgAAAAAAAPA_yAYA2gYWChAAAAAAAAAAAAAAAAAAAAAAEAAYAOAGDPIGAggAgAcB&s=c1b267c8fc816d406ad7648369dc65bcca3e37e3&type=nv&nvt=5&jm=1003&px=293&py=2683&bw=235&bh=183&sid=6948336581580320943&vd=ct~0|rr~0&sv=162&tv=native1-18hs&ua=chrome52&pl=mac&x=v&tag_id=12611978&cid=3&cr=nv&sw=1600&sh=1200&pw=1603&ph=5914&ww=1600&wh=1200&ft=0
Requested by
Host: cdn.adnxs.com
URL: https://cdn.adnxs.com/v/s/162/trk.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.249 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
534.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
AN-X-Request-Uuid
4c675ce5-b492-4159-9879-1d51f86915ce
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 534.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.232:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=4a0240ce7.f331905b7_1557932414140&1557932414140
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:14 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 7AEC
482 B
491 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2120998152731887&correlator=3230069780776923&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&vrg=2019050901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-33&iu=%2F53015287%2Fgolem.de_d_300x600_1_dc&sz=10x40%7C10x30%7C10x20%7C10x22%7C120x600%7C160x600%7C200x600%7C300x600&scp=adslot%3Dsky%26src%3Dsdg&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&lmt=1557932414&dt=1557932414166&dlt=1557932412735&idt=1410&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adx=1303&ady=10&adk=3954477340&uci=owizay3lh7g5&ifi=1&ifk=1794811741&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x40&msz=300x40&blev=1&bisch=1&ga_vid=287754649.1557932414&ga_sid=1557932414&ga_hid=1972195300&fws=256
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
3c5f4bab273c3467b080d70cae852a06e4be01fce3d4748a3c7fedbed0c9c2c6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
316
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame 7AEC
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
93d39da3773a26f38a235454f91d1d2a57a0d9d066c72f9a41452651b08e539e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27443
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:14 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-33/html/ Frame 7AEC
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-33/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN (),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame ED74
482 B
482 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1872251043961729&correlator=1318107188952218&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062452%2C21063202%2C21063741&vrg=2019050901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-33&iu=%2F53015287%2Fgolem.de_d_970x250_1_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C800x250%7C970x250%7C728x90%7C728x180%7C770x250&scp=adslot%3Dbanner%26src%3Dsdg&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&lmt=1557932414&dt=1557932414199&dlt=1557932412794&idt=1396&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=250&oid=3&adx=308&ady=140&adk=3221795798&uci=5n581lbxfdxj&ifi=1&ifk=2367198889&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=970x10&msz=970x10&blev=1&bisch=1&ga_vid=370023082.1557932414&ga_sid=1557932414&ga_hid=1499692737&fws=256
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
d3f0b18ecfed35542118ed5eb92d5ac4d4ee5c5debd378af0344e43b737ab035
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
320
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame ED74
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
93d39da3773a26f38a235454f91d1d2a57a0d9d066c72f9a41452651b08e539e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27443
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:14 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-33/html/ Frame ED74
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-33/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN (),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.33.59 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-33-59.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:14 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
ima3.js
imasdk.googleapis.com/js/sdkloader/
236 KB
81 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
2f25e5f6f042386f0cbd93633fb42ce8351f2928108824351cb9717460214354
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
82617
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:14 GMT
best-of-the-web-trust-seal-(firmenvideo).jpg
video.golem.de/teaser/1/1/22898/thumb-high-700/
54 KB
54 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22898/thumb-high-700/best-of-the-web-trust-seal-(firmenvideo).jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e5d1abb983fb4642a5c12b36921ee88e3444084d8d34265be58c85f13c22dc45

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:14 GMT
Last-Modified
Wed, 15 May 2019 14:22:34 GMT
Server
nginx
ETag
"5cdc20aa-d692"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
54930
Expires
Sat, 15 Jun 2019 15:00:14 GMT
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
truncated
/
715 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:14 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-3bf0"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15344
Expires
Sat, 15 Jun 2019 15:00:14 GMT
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:14 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-20e4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8420
Expires
Sat, 15 Jun 2019 15:00:14 GMT
ads
securepubads.g.doubleclick.net/gampad/ Frame 9ED3
482 B
482 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2578427817777647&correlator=2987945250554993&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21061865%2C21062454%2C21063096%2C953563517&vrg=2019050901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-33&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=10x20%7C10x10%7C300x250%7C300x601%7C300x125&scp=adslot%3Drectangle%26src%3Dsdg&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&lmt=1557932414&dt=1557932414315&dlt=1557932412812&idt=1494&frm=23&biw=1585&bih=1185&isw=300&ish=601&oid=3&adx=993&ady=1062&adk=1812355494&uci=bq2eyf3p01ik&ifi=1&ifk=1050213878&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x20&msz=300x20&blev=1&bisch=1&ga_vid=1358966125.1557932414&ga_sid=1557932414&ga_hid=27691000&fws=256
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
364fba31dd048fc81ed79ea9f34caf1002ccbb4f38fd8b15666098856f20e61b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
319
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame 9ED3
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
93d39da3773a26f38a235454f91d1d2a57a0d9d066c72f9a41452651b08e539e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27443
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:14 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-33/html/ Frame 9ED3
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-33/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN (),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame D535
482 B
483 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=95110687873326&correlator=320824063461618&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062833%2C21063692&vrg=2019050901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-33&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C10x11%7C301x250%7C300x126&scp=adslot%3Drectangle2%26src%3Dsdg&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&lmt=1557932414&dt=1557932414359&dlt=1557932412836&idt=1497&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=2&adx=993&ady=3852&adk=4292326851&uci=5p01ny6xkq0m&ifi=1&ifk=3514803478&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=301x10&msz=301x10&blev=1&bisch=1&ga_vid=1852703147.1557932414&ga_sid=1557932414&ga_hid=2117061097&fws=256
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
0854d52a6ac80c7f6bb86f5e03da6005c013d002bc58da5ec2389c814c42df20
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
321
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019050901.js
securepubads.g.doubleclick.net/gpt/ Frame D535
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019050901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.22.66 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
93d39da3773a26f38a235454f91d1d2a57a0d9d066c72f9a41452651b08e539e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:14 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 09 May 2019 13:16:49 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27443
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:14 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-33/html/ Frame D535
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-33/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019050901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:806::2001 Frankfurt am Main, Germany, ASN (),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

vevent
fra1-ib.adnxs.com/
0
808 B
Other
General
Full URL
https://fra1-ib.adnxs.com/vevent?an_audit=0&referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&e=wqT_3QLLCfBDywQAAAMA1gAFAQj-0vDmBRD4v_6sz_ia0AsY-vKV2Y26jtt3KjYJF30Facai1T8RF30Facai1T8ZAAAAYGZmCEAhF30JGwApESTwyTEAAADAHoXrPzCK44EGOOsbQOsbSAJQ2eirSFjum1hgAGjUy3x49ZMFgAEBigEDVVNEkgEDRVVSmAEBoAEBqAEBsAEAuAECwAEEyAEC0AEJ2AEA4AEA8AEAigKUAXVmKCdhJywgMzE2Mzk4NCwgMTU1NzkzMjQxNCk7dWYoJ2knLCAxMDg5OTM0LCAxNTU3OTMyNDE0KTt1ZignZycsIDc2MzQ3NjksIDE1NTc5MzI0MTQpO3VmKCdjJywgMjgyOTM1NzgsIDE1NTcuWAAwcicsIDE1MTcxMjg1NwELADUVPfR1AZIC5QIhcmxVTTNnaks4NzRORU5ub3EwZ1lBQ0R1bTFnd0JEZ0FRQVJJNnh0UWl1T0JCbGdBWVBfX19fOFBhQUJ3QVhnQmdBRUJpQUVCa0FFQm1BRUJvQUVRcUFFS3NBRUF1UUhZMmo5YklFZlRQOEVCTzQzejhieWkxVF9KQVFBQUFNQ1BYUEFfMlFFWG53SmdQSVBzUC1BQmpzTkM5UUVBQUQ1RG1BSUFvQUlFdFFJQUFBQUF2UUlBQUFBX3dBSUJ5QUlCMEFJQjJBSUI0QUlBNkFJQS1BSUFnQU1CbUFNQm9nTVVDSV8yMHdVUUFoZ0JMUUFBQUFBeUJHTnpYeldpQXc0SWp1YUhCaEFFR0FFdDVUTkxPcUlERXdpcXZvTUdFQW9ZQVMxLTVJSV9NZ04xYm11b0E4cnp2ZzI2QXdsR1VrRXhPalF4TkRYZ0Etb0xnQVQteFBjQmlBUzBxZjRCa0FRQm1BUUKaAmEhT2hPY1Znaks4PWjQN3B0WUlBUW9BREZTdUI2RjYxSElQem9KUmxKQk1UbzBNVFExUU9vTFNSZWZBbUE4Zy13X1UhOA0BAFcdDPCk2ALmkwHgApiTRuoCWmh0dHBzOi8vd3d3LmdvbGVtLmRlL25ld3MvYmVzdC1vZi10aGUtd2ViLXRydXN0LXNpZWdlbC12ZXJ0ZWlsdC1rZXlsb2dnZXItMTkwNS0xNDEyNzUuaHRtbPICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPTV9NT0RFTF9MRUFGX05BTUUSAPICHgoaQ1VTVE9NDTMMTEFTVAEL8O1JRklFRBIAgAMBiAMBkAMAmAMUoAMBqgMAwAPgqAHIAwDYA964KOADAOgDAPgDA4AEAJIECS9vcGVucnRiMpgEAKgEALIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDjM1NjMjRlJBMTo0MTQ12gQCCAHgBADwBNnoq0iIBQGYBQCgBf___________wGqBREzNDcwNDUyMjY0NjY0NDU3NMAFAMkFAAAAAAAA8D_SBQkJAAAAAAAAAADYBQHgBQHwBdLGH_oFBAgAEACQBgGYBgC4BgDBBgAAAAAAAPA_yAYA2gYWChAAAAAAAAAABRYBATgQABgA4AYM8gYCCACABwE.&s=057c59954ac6622c84aed060c03b226c92c06894&type=nv&nvt=5&jm=1003&px=548&py=2866&bw=235&bh=202&sid=6948336581580320943&vd=ct~0|rr~0&sv=162&tv=native1-18hs&ua=chrome52&pl=mac&x=v&tag_id=12611978&cid=3&cr=nv&sw=1600&sh=1200&pw=1603&ph=5914&ww=1600&wh=1200&ft=0
Requested by
Host: cdn.adnxs.com
URL: https://cdn.adnxs.com/v/s/162/trk.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.249 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
534.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
AN-X-Request-Uuid
f60c2573-5400-4924-81fe-3d11e479c7a6
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 534.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.50:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
vevent
fra1-ib.adnxs.com/
0
808 B
Other
General
Full URL
https://fra1-ib.adnxs.com/vevent?an_audit=0&referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&e=wqT_3QKQCvBMEAUAAAMA1gAFAQj-0vDmBRCQsaeVh8SP1w0Y-vKV2Y26jtt3KjYJmN2Th4Va0T8RJqWHPqsOzD8ZAAAAYGZmCEAhJqWHPqsOzD8pmN0JJPCVMQAAAMAehes_MIrjgQY46xtAtDhIAlDw__k4WO6bWGAAaNTLfHj1kwWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQXIAQLQAQnYAQDgAQDwAQCKApMBdWYoJ2EnLCAxMzQwMjQyLCAxNTU3OTMyNDE0KTt1ZignaScsIDkxNTg5OSwgMTU1NzkzMjQxNCk7ARwkZycsIDc3MDg5MEodADRjJywgMjg1MTU1MDEsID5XAAByAXQcMTk0MzkzNDQ2HwD0jgGSAoEDITdWaEVTd2lydWN3TkVQRF8tVGdZQUNEdW0xZ3dCRGdBUUFCSXREaFFpdU9CQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFU3FBRUJzQUVBdVFIekhUdGUydXpPUDhFQkoyeXBKNVJhMFRfSkFRQUFBQUFBQVBBXzJRRVhud0pnUElQc1AtQUJ1X00zOVFITFpuYy1nQUlBaUFLcnhaUURpQUt5eFpRRGtBSUNtQUlBb0FJQnFBSUN0UUlBQUFBQXZRSUFBQUFBd0FJQnlBSUIwQUlCMkFJQjRBSUE2QUlBLUFJQWdBTUJtQU1Cb2dNT0NQdloyd1VRQVJnQ0xRQUFnRC1pQXhVSXpPUGJCUkFDR0FFdEFBQUFBRElGWTNOZk1UR2lBdzRJLTluYkJSQUxHQUl0QUFDQVA2Z0RyYm5NRGJvRENVWlNRVEU2TkRRek4tQUQ2Z3VBQktIcmlnS0lCS1hyaWdLUUJBR1lCQUdnQkFvLpoCYSFhdy1acVE2hAEoN3B0WUlBQW9BREUhJgkBfERvSlJsSkJNVG8wTkRNM1FPb0xTUmVmQW1BOGctd19VMVQMQUFBVx0M8HXYAuaTAeACmJNG6gJaaHR0cHM6Ly93d3cuZ29sZW0uZGUvbmV3cy9iZXN0LW9mLXRoZS13ZWItdHJ1c3Qtc2llZ2VsLXZlcnRlaWx0LWtleWxvZ2dlci0xOTA1LTE0MTI3NS5odG1s8gIRCgZDUEdfSUQSBzc3Ra8s8gIRCgVDUF9JRBIIUaVA8gITCg9DVVNUT01fTU9ERUwBHhQA8gIaChYyFgAgTEVBRl9OQU1FAR0IHgoaNh0ACEFTVAE-8O1JRklFRBIAgAMBiAMBkAO16h2YAxSgAwGqAwDAA-CoAcgDANgD3rgo4AMA6AMA-AMDgAQAkgQJL29wZW5ydGIymAQAqAQAsgQMCAAQABgAIAAwADgAuAQAwAQAyAQA0gQONzIyMCNGUkExOjQ0MzfaBAIIAeAEAPAE8P_5OIgFAZgFAKAF____________AaoFETM0NzA0NTIyNjQ2NjQ0NTc0wAUAyQUAAAAAAADwP9IFCQkAAAAAAAAAANgFAeAFAfAFzpsB-gUECAAQAJAGAZgGALgGAMEGAAAAAAAA8D_IBgDaBhYKEAAAAAAABTcJATgQABgA4AYM8gYCCACABwE.&s=2c16f34d0a2a6d705b9d9ba36a7527699c2712db&type=nv&nvt=5&jm=1003&px=1058&py=2866&bw=235&bh=183&sid=6948336581580320943&vd=ct~0|rr~0&sv=162&tv=native1-18hs&ua=chrome52&pl=mac&x=v&tag_id=12611978&sw=1600&sh=1200&pw=1603&ph=5914&ww=1600&wh=1200&ft=0
Requested by
Host: cdn.adnxs.com
URL: https://cdn.adnxs.com/v/s/162/trk.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.249 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
534.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
AN-X-Request-Uuid
bf92422a-b809-4ecd-8d02-f186f21440ab
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
5.254.82.68; 5.254.82.68; 534.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.173.49:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=5207780466
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9vdGFlbG9veWVlYmFaZWU9T290YWVsb295ZWViYVplZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5VYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuQmgobSksYS5GZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5ZcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay4kYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5CZChjKTthLkl2KGwpO2EuSHYobSk7YS55digpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpsPXRoaXMuYVs4XTt0aGlzLmJ4PQp0aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbOV07dGhpcy52bz10aGlzLmFbNl07dGhpcy50bD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLkF1PWI7Yi5wcm90b3R5cGU9e0lsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KbDp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYng6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhwOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkF1fHxrYSxkZD1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1kZC5JbCg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWXA9ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuRGM9W107dGhpcy4kZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJ2LmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5LZz17fX1jLkFrPWI7Yi5wcm90b3R5cGU9e2d3OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rIl8iKTtyZXR1cm4gYX0sZ2I6ZnVuY3Rpb24oYSl7dGhpcy5mYlthXXx8KHRoaXMuZmJbYV09MCk7dGhpcy5mYlthXSs9MTs1PHRoaXMuZmJbYV0mJiF0aGlzLktnW2FdJiYodGhpcy5LZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmd3KCksITApKX0sJGY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sCnNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxidjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5hdihhLmRhdGEpfSxhdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuY2EuZXZlbnRsaXN0ZW5lci5sZW5ndGgsCmQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sWWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sZGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuJGcoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHwKYls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuUnIoYSkpcmV0dXJuOyhiPXRoaXMuZGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxScjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxvZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxPYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHlnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxIaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKVGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx4ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OwowPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0seWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktCmEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoYSl9LmJpbmQodGhpcyksMTAwKX0sd2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxJPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrOwpjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUk7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMTg1OTc3NTM5MyYKNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0k9SStsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihJKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LHBiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJgoxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxtdDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGllOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLAplPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iub2I/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChuKXt9YS5pc1BoYW50b21KUz0KYjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LGFzOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5pZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFFhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGtqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApSczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxYbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5WaSgpfHxhLmtqKCl8fGEuUnMoKXx8YS5tbSgpfHxhLlhuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGhkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxLcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxkdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx0ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVGgoYikrIjoiK3RoaXMuVGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFRoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSwkZTpmdW5jdGlvbihhKXt0aGlzLlBhPWF9LHFnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUGE7dGhpcy5PZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHFjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5xZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZWQpe3ZhciByPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYocj1rLlRhKGEsYikpO2YmJihyPWsuVGEocixmKSk7YyYmKHI9ay5UYShyLGMpKTtoJiYocj1rLlRhKHIsaCkpO2VkJiYocj1rLlRhKHIsaCkpO2UucWMocil9LGR2OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSYmMTAyMyE9YS5jb2RlJiYxMDE4IT1hLmNvZGUpe3RyeXtpZihsYSYmKGIuc2Vzc2lvbl9pZD1sYSksYi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iLGEuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKSxiLmV2ZW50PWEuY29kZSxiLnNpdGVfaHJlZj0KdGhpcy5xcygpLGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH19Y2F0Y2goZCl7fXJldHVybiBifX0sT2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kdihhKTtpZihiKWlmKCFsfHwhbC5iYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwueGQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wud2EoYSwhMCk7YT1sLndhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIjthLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wuSGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5FY3x8KHRoaXMuRWM9e30pO3RoaXMuRWNbZl18fCh0aGlzLkVjW2ZdPTApO3RoaXMuRWNbZl0rKzsxMDx0aGlzLkVjW2ZdfHwoZj1sLnhkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLndhKGYsITApLGY9bC53YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIisKZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxHZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwua3EoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxvZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoPwp0aGlzLmJiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxxZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5qZChhKToiIn0samQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGFxOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuQWUoYSl8fHRoaXMucHQoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5ZZSYmd2luZG93LnNhbmRib3guWWVbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7CmlmKHRoaXMub2coYSkpcmV0dXJuIHRoaXMub2coYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnBiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuVWEoYSxiLkdhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLm5kKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLlJvKGMsYSk7cmV0dXJuIGN9LFVhOmZ1bmN0aW9uKGEsYiwKZCxmLGMsaCxlLHIpe3ZhciBrPWh8fGw7aD0hMDtyJiYoaD0hMSk7aWYoayYmay5iYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2sud2EoYSxoKTtoPWsud2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBrLkhhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYShhLGIsZCxmLGMsayxlLHIpfS5iaW5kKHRoaXMpLDUwMCl9LCRnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciByPSEwO2UmJihyPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHIpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxXdDpmdW5jdGlvbihhLGIsZCl7dGhpcy4kZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5EYylmb3IodmFyIGMgaW4gdGhpcy5EYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxhaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlVhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuV3QoZi5uZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRjPWF9LFd4OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5VYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxNcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sa3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuQWt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93Lm1nPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fAp7fX1jLnprPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuVHU9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuaXU9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSng9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Bcj17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5OZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuSW89e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5peD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnlxPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5hZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLiRjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5MZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuTG89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5PYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVmQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuWGQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLktvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi4kaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLmx1PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IucmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5iZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSXg9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZng9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5qdT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMuemt8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnJvPXRoaXMuYVsyXTt0aGlzLlVxPXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxXTt0aGlzLkFwPXRoaXMuYVs3XTt0aGlzLiRtPXRoaXMuYVs1XTt0aGlzLnN1PXRoaXMuYVs2XTt0aGlzLktqPXRoaXMuYVsyXTt0aGlzLiR1PXRoaXMuYVsxMF07dGhpcy5icD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs3XX1jLnNxPWI7Yi5wcm90b3R5cGU9e3FvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybzp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MdDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXA6dGhpcy5abShhKX0sWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLiRtOnRoaXMucnUoYSl9LHJ1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zdTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktqOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kdTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYT1jLnNxfHxtYSxmZD1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1mZC5xbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkJrPWI7Yi5wcm90b3R5cGU9e3JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxxYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4Iil9LGtzOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGZkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5mZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5mZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LHdjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmUodGhpcy5xYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmZkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxndDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndjKCkrIjIifSxRZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlKHRoaXMua3MoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5mZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMuQmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXE9dGhpcy5hWzRdO3RoaXMucG49dGhpcy5hWzddO3RoaXMuVWo9dGhpcy5hWzZdO3RoaXMua2k9dGhpcy5hWzddO3RoaXMuRnA9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5ndj1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXE6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBuOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmppKGEpfSxqaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2k6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5ndnx8bmEsZ2Q9Cm5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWdkLmNxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/CmYuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51Zj1ifSkoYyk7dmFyIEo9Yy51Znx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVszXX1jLk9xPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIG9hPWMuT3F8fG9hLGhkPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWhkLllqKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Mudm09CkouZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5HPW51bGw7dGhpcy5BYz0xMDA7dGhpcy54Yj0wO3RoaXMuSWE9MTUwO3RoaXMuQWI9MDt0aGlzLkp2KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy54Yjw9dGhpcy5JYT8odGhpcy54YisrLHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpOjA+dGhpcy5JYSYmKHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpfSxBdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhiPnRoaXMuSWE/ITA6ITF9LHpkOmZ1bmN0aW9uKCl7dGhpcy54Yj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sSnY6ZnVuY3Rpb24oYil7dGhpcy5HPWJ9LGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sSzpmdW5jdGlvbihiKXt0aGlzLkphW2IucWIoKV09YjtLJiZLLllnJiZLLmZ3KGIpfSxBeTpmdW5jdGlvbigpe3JldHVybiBlLk9hKHRoaXMuSmEpfSwKSjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9LGx0OmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTnk6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy52bXx8dDsoZnVuY3Rpb24oYyl7Yy54bT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkFjPTEwO3RoaXMueGI9MDt0aGlzLklhPTUwO3RoaXMuTj1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnNiPSIiO3RoaXMuaGc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApnPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt9LFN2OmZ1bmN0aW9uKGIpe3RoaXMuTj1ifSxCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk59LE12OmZ1bmN0aW9uKGIpe3RoaXMuS2U9Yn0senk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sSmU6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLnhiPD10aGlzLklhJiYodGhpcy54YisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuQWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LHhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEFkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sUHk6ZnVuY3Rpb24oKXt9LFY6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSHMoKXx8dGhpcy5PbygpO3RoaXMuQWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKQ3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sT286ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZ2EoMTApKX0sSHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFM6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxIeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxmYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxEZTpmdW5jdGlvbigpe3JldHVybiExfSxDaDpmdW5jdGlvbihiKXt0aGlzLnNiPWJ9LHl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2J9LHhoOmZ1bmN0aW9uKCl7dGhpcy5zYj1udWxsfSxFeTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuc2ImJihiPSEwKTtyZXR1cm4gYn0sSnk6ZnVuY3Rpb24oKXt0aGlzLmhnfHwodGhpcy5oZz0hMCl9LHNjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHZ5OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIG49Yy54bXx8bjsoZnVuY3Rpb24oYyl7Yy5zaT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLkRmPSIxIjt0aGlzLkVmPSIyIjt0aGlzLnlvPSIzIjt0aGlzLkljPTA7dGhpcy5laD0zMDt0aGlzLkZiPVtdO3RoaXMuWmE9W107dGhpcy5iYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5QZj10aGlzLldoPSExO3RoaXMuc3RhdHVzPXRoaXMuSWM7dGhpcy5pZD1lLmdhKDEwKTt0aGlzLkJkKGIpO3RoaXMuS3YoYSl9LGM6ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7dGhpcy5XaHx8KHRoaXMuV2g9ITAsZS5HZSgpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtTJiZTLk1iJiYhcGEmJihwYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sRjpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLlB2KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5QaCgpLHRoaXMuUGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLkZiLnB1c2goYiksdGhpcy5aYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkZiJiYwPHRoaXMuRmIubGVuZ3RoJiYodGhpcy5GYj1lLnVuaXF1ZSh0aGlzLkZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5GYi5qb2luKCIsIikpKTtpZih0aGlzLlphKXtmb3IodmFyIGc9MDtnPHRoaXMuWmEubGVuZ3RoO2crKyl0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXT09dGhpcy5iY1tiXSYmYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSx0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXTwKdGhpcy5iY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSxiPXRoaXMuWmFbZ10ucmVhc29uKTt0aGlzLmJjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LFB2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZn0sUXY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnlvfSxLYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSWN9LEdmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxteTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5FZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuSWN9LEJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPQpifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEt2OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxoczpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LFp0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5zaXx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbD10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbNV07dGhpcy5Uaz10aGlzLmFbMl07dGhpcy5Ebz10aGlzLmFbNF07dGhpcy5QdD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs2XX1jLlhpPWI7Yi5wcm90b3R5cGU9e1VsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WbDp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQmo6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRrOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuRG86dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlB0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5YaXx8cWEsaWQ9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuVWwoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSwKaWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTiYmdGhpcy5OKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5Eanx8VDsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuT2Q9bnVsbDt0aGlzLnJ4PTFFMzt0aGlzLm5oPW51bGw7dGhpcy5Kdz0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub2IpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Kci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuRHMuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5DcyhhLApiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV4KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52eChiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkJzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy53cShhKX0uYmluZCh0aGlzKSl9LHdxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sdXg6ZnVuY3Rpb24oYil7dGhpcy5PZHx8KHRoaXMuT2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd4KGIpfS5iaW5kKHRoaXMpLHRoaXMucngpKX0sd3g6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2QpO3RoaXMuRigpfSx2eDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZCl9LApCczpmdW5jdGlvbihiKXt0aGlzLnN5KGIpO3RoaXMubmg9bmV3IERhdGU7dGhpcy5uaC10aGlzLld1PHRoaXMuSnc/dGhpcy5GKCk6dGhpcy5zKCl9LERzOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuQmQobmV3IFQoYSkpKTt0aGlzLkYoKX0sSnI6ZnVuY3Rpb24oKXt9LENzOmZ1bmN0aW9uKCl7dGhpcy5XdT1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk9hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZywKdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRWp8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rdj10aGlzLmFbNV07dGhpcy5Qcz10aGlzLmFbM107dGhpcy51dT10aGlzLmFbNl07dGhpcy4keD10aGlzLmFbN107dGhpcy5Paz10aGlzLmFbMTBdO3RoaXMucm49dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMl19Yy5Haj1iO2IucHJvdG90eXBlPXtqdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Y6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51dTp0aGlzLlp4KGEpfSxaeDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHg6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9rOgp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1YT1jLkdqfHx1YSxqZD1uZXcgdWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1qZC5qdig0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3RoaXMubmcoKTt0aGlzLnBnKCk7dGhpcy54cT0hMX0sbmc6ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5OYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxwZzpmdW5jdGlvbigpe2lmKCF0aGlzLk5iKXt2YXIgYj0KdGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuTmI9ITApO3RoaXMuVihhKX19LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTiYmKDAsdGhpcy5OKSgpfS5iaW5kKHRoaXMpKX0sSmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5FZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcykpfSxFZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLktlJiYoMCx0aGlzLktlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTsKcmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgdmE9Yy5Za3x8dmE7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTTpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkljO3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMX0sYzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/CmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuV2Q9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmxiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5sYj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5sYj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMubGI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTsKdGhpcy5LYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuZWgmJiF0aGlzLmhhKCkmJih0aGlzLmxiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMuaGEoKSYmKHRoaXMuS2EoKSx0aGlzLmdldFBsYXllcigpLnhxPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5zYjthJiYoYS50ZCgpLGEuZ2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuS2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5laCYmIXRoaXMuaGEoKSYmKHRoaXMubGI/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLk1jLmluZGV4T2YoYSkmJnRoaXMuTWMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5lYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm8oImFkZXJyb3IiLGIuY29kZSksdGhpcy5NYy5sZW5ndGg+PXRoaXMuV2QmJnRoaXMudSgpKX0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5pKCJKVzogIitiLnR5cGUpfSx1OmZ1bmN0aW9uKGIpe2I/dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xOnRoaXMua2U/dGhpcy5rZSsrOnRoaXMua2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSGgoYS52aWRlb1RhZyk/YS5OYj90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLktjfHx0aGlzLmlzUGxheWluZz8odGhpcy5rZT50aGlzLmxlJiYoYj0hMSksdGhpcy5GKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEubmcoKSxhLnBnKCksYS5OYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgd2E9Yy5Ya3x8d2E7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5kcygpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IHZhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5KKGcpfHx0aGlzLmx0KGcpfHwodGhpcy5LKGcpLGc9bmV3IHdhKGcsdGhpcy5HKSxnLk0oKSxnLmMoKSl9fXRoaXMuSSgpfX0seHk6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sZHM6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnBiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB4YT1jLlprfHx4YSx5YT1uZXcgeGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBqPXRoaXMuYVs2XTt0aGlzLkN3PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuSWs9YjtiLnByb3RvdHlwZT17b2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBqOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMuSWt8fHphLGtkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWtkLm9qKDQpOyhmdW5jdGlvbihjKXtjLlpuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTsKdmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLlpufHxBYTsoZnVuY3Rpb24oYyl7Yy5Zbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHwKYi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5Zbnx8QmE7KGZ1bmN0aW9uKGMpe2MuJG49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5PYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPQpiW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IEFhKGcpLHRoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuJG58fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ibj10aGlzLmFbNF07dGhpcy5LdT10aGlzLmFbMV07dGhpcy5Udz10aGlzLmFbOV07dGhpcy54dT10aGlzLmFbNV07dGhpcy5KdD10aGlzLmFbMV07dGhpcy5IdD10aGlzLmFbMl07dGhpcy5CbD10aGlzLmFbOF07dGhpcy5rcD10aGlzLmFbNF07dGhpcy5iaj10aGlzLmFbNF07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVszXX1jLlFzPWI7Yi5wcm90b3R5cGU9e0duOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ibjp0aGlzLkp1KGEpfSwKSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkt1OnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Udzp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh1OnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KdDp0aGlzLkd0KGEpfSxHdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHQ6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJsOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5haihhKX0sYWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJqOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuUXN8fEVhLGxkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5Hbig0KTsoZnVuY3Rpb24oYyl7Yy5Nbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5pYihiKX0uYmluZCh0aGlzKSl9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuTW58fEZhOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucWE9dGhpcy52Yz10aGlzLnhhPXRoaXMuU2M9ITE7dGhpcy51aD1lLndiKDEwKTt0aGlzLlZoPSEwO3RoaXMuZ2M9dGhpcy5OZz0hMTt0aGlzLmloKCk7dGhpcy5ocSgpO3RoaXMuU2EoKX0sS3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLnFiKCksCiI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRGE/Yi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5EYT90eXBlb2YgYi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuRGE/Yi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi5EYT90eXBlb2YgYi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlRkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuVGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuVWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS52YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi52YToidW5kZWZpbmVkWCIsIjsiLGIuUj8KdHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuWmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5yYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudmF9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmMpe3ZhciBiPXRoaXMucmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy52Yz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMudmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy52Y30sanQ6ZnVuY3Rpb24oKXtpZighdGhpcy5NZyl7dmFyIGI9CnRoaXMucmIoKSxhPXRoaXMuaXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk1nPSEwKX1yZXR1cm4gdGhpcy5NZ30saXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5TYz0hMCk7cmV0dXJuIHRoaXMuU2N9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxYZTpmdW5jdGlvbigpe3RoaXMuZ2M9ITA7dmFyIGI9dGhpcy5CZygpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlFhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5oYz0hMDtpZihlLnViKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSx3eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2cmJmIuYWRzJiYodGhpcy5jZz1iLmFkcyk7cmV0dXJuIHRoaXMuY2d9LGhxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLkthKCk7dGhpcy5hYSghMCk7dGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7CnRoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQmcoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksNTApfSxpaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5qdCgpKXt2YXIgYT0KdGhpcy5yYigpLGc9dGhpcy5KYigpO2EmJmcmJih0aGlzLnJiKCksdGhpcy5KYigpLHRoaXMuZ2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nYz90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMucmIoKX1lbHNlIHRoaXMuTmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJiKCksYj10aGlzLkpiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5hYSgpKToodGhpcy5hYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuTmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5paCgpfS5iaW5kKHRoaXMpLDUwKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0saXE6ZnVuY3Rpb24oKXt0aGlzLm1jfHwodGhpcy5tYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMubWMhPWIuYWRzLnN0YXRlJiYodGhpcy5tYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5tYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLm1jPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pcSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXswPD1lLmhkKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlc/dGhpcy51KCEwKToodGhpcy5xYT0hMCx0aGlzLnMoImVtcHR5IHZhc3QiKSl9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwodGhpcy5WaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkYodGhpcy5WaCxmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbnE6ZnVuY3Rpb24oKXt0aGlzLkZ5fHwoMTA8dGhpcy5zeD8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN4KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuenYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnEoKX0uYmluZCh0aGlzKSw1MCkpKX0senY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLnR4KXt0aGlzLnR4PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIEdhPWMuTG58fEdhOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkloKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5JaChiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxJaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS5PYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm1hfHx0aGlzLkooYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuSyhhKSwobmV3IEdhKGEsdGhpcy5HKSkuYygpKSk7cmV0dXJuITB9cmV0dXJuITF9LEk6ZnVuY3Rpb24oKXt0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMuQWMpfX0pfSkoYyk7dmFyIEhhPWMuTm58fEhhLElhPW5ldyBIYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ucj10aGlzLmFbOV07dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VcD10aGlzLmFbNV07dGhpcy5vcD10aGlzLmFbN107dGhpcy5IbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5tcD10aGlzLmFbM107dGhpcy5xcD10aGlzLmFbMV07dGhpcy5Gbz0KdGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNl19Yy5PeD1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubnI6dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KcDp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXA6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vcDp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGw6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldvOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXA6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFwOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7CnZhciBKYT1jLk94fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5tcig0KTsoZnVuY3Rpb24oYyl7Yy5sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7Yi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlMoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0sbGE6ZnVuY3Rpb24oKXt9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLk4mJgoidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLAphPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5sbnx8S2E7KGZ1bmN0aW9uKGMpe2Mua249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuS2I9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWmI9ITE7dGhpcy53aCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT1iLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlpiPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTsKYi5nZXRQbGF5ZXIoKTt0aGlzLlhjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuWWYoKTp0aGlzLnMoKX0sWGM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7YS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuWmI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7CmEuZ2V0UGxheWVyKCk7dGhpcy5aYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMucygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhjLmJpbmQodGhpcyksMTAwKX19LFlmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmCih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LYiksdGhpcy5zKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5LYiYmKHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHwodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkYoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5ZZi5iaW5kKHRoaXMpLDUwKX19LHdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiYKYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlpiPSEwLHRoaXMucygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53aCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmtufHxMYTsoZnVuY3Rpb24oYyl7Yy5tbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmCnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5tbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR5PXRoaXMuYVs0XTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLk1pPXRoaXMuYVs2XTt0aGlzLlNwPXRoaXMuYVsyXTt0aGlzLlNqPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzddfWMuc3I9YjtiLnByb3RvdHlwZT17Y3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5keTp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGk6dGhpcy5MaShhKX0sTGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5NaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3A6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5zcnx8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuY3koNCk7KGZ1bmN0aW9uKGMpe2MuaG49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZWxfO2F8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5lbD9hPWIuZWwoKToiZnVuY3Rpb24iPT10eXBlb2YgYi5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCgpKSkpO3RoaXMuUyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCihiPWJbMF0pO3RoaXMuVihiKX0saWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YSYmYi5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZTIifSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLm11dGVkJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5tdXRlZCYmKGI9YS5tdXRlZCgpKTtyZXR1cm4gYn0sc2M6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5obnx8UGE7KGZ1bmN0aW9uKGMpe2MuZ249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5YZigpO2Iub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5Kb3x8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygidGltZXVwZGF0ZSIpO3RoaXMuRighMCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX0ZJUlNUX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLm8oImFkc2Vycm9yIik7dGhpcy5BcyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LEFzOmZ1bmN0aW9uKGIpe3ZhciBhPTk5OTk5OTtpZihiLmRhdGEmJmIuZGF0YS5BZEVycm9yKWZvcih2YXIgZyBpbiBiLmRhdGEuQWRFcnJvciliLmRhdGEuQWRFcnJvci5oYXNPd25Qcm9wZXJ0eShnKSYmIm51bWJlciI9PXR5cGVvZiBiLmRhdGEuQWRFcnJvcltnXSYmKGE9Yi5kYXRhLkFkRXJyb3JbZ10sdGhpcy5vKGEpKTs5MDE9PWE/dGhpcy5zKCk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PQphPyh0aGlzLlpiPSEwLHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMuSm89ITAsdGhpcy5zKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5YZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz90aGlzLkYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBRYT1jLmdufHxRYTsoZnVuY3Rpb24oYyl7Yy5qbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UmJiJmdW5jdGlvbiI9PQp0eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy56ZCgpLHRoaXMuSSgpfX0pfSkoYyk7dmFyIFJhPWMuam58fFJhLFNhPW5ldyBSYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kaz10aGlzLmFbMV07dGhpcy5FdD10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsxXX1jLkh3PWI7Yi5wcm90b3R5cGU9e2NrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZGs6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgVGE9Yy5Id3x8VGEsb2Q9bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9b2QuY2soNCk7KGZ1bmN0aW9uKGMpe2MuWmk9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5oaD1hfSxNOmZ1bmN0aW9uKCl7fSxIZTpmdW5jdGlvbihiKXt0aGlzLmhoPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmhoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTt0aGlzLlYoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKUDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgVWE9Yy5aaXx8VWE7KGZ1bmN0aW9uKGMpe2MuWWk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxIZTpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZhPWMuWWl8fFZhOyhmdW5jdGlvbihjKXtjLiRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFVhKGQsYSksdGhpcy5KKGQpfHwoZC5IZShhKSx0aGlzLksoZCksCmQ9bmV3IFZhKGQsdGhpcy5HLGcpLGQuSGUoZyksZC5jKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgV2E9Yy4kaXx8V2EsWGE9bmV3IFdhKGlhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbMTBdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMuSm49dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzldO3RoaXMueGk9dGhpcy5hWzldO3RoaXMuT3U9dGhpcy5hWzZdO3RoaXMuRmw9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy50cT1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXA6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5vOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53czp0aGlzLkluKGEpfSwKSW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpuOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vazp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhpOnRoaXMuTnUoYSl9LE51OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PdTp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYT1jLnRxfHxZYSxwZD1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1wZC5QcCg0KTsoZnVuY3Rpb24oYyl7Yy55bD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07CnRoaXMuUyhiKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxRYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBaYT1jLnlsfHxaYTsoZnVuY3Rpb24oYyl7Yy54bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5RYSgpPwooJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5MYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSkpOnRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyICRhPWMueGx8fCRhOyhmdW5jdGlvbihjKXtjLnpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFphKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgJGEoYix0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFiPWMuemx8fGFiLGJiPW5ldyBhYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy50bz10aGlzLmFbM107dGhpcy5Edj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy5ycT1iO2IucHJvdG90eXBlPXtobTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW06dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRvOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Edjp0aGlzLmooYSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLnJxfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5obSg0KTsoZnVuY3Rpb24oYyl7Yy5xbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLlBlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5mYSgpO3JldHVybn10aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlYoYik6dGhpcy5mYSgpfSxYdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnNiLGc9dGhpcy5xYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5NYiYmKDA8PWcuaW5kZXhPZihkKXx8YS50ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUGU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxSYTpmdW5jdGlvbigpe3RoaXMuUGUrKztpZigxMDx0aGlzLlBlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGxhOmZ1bmN0aW9uKCl7fSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLk4mJnRoaXMuTigpfX0pfSkoYyk7dmFyIGRiPWMucW18fGRiOyhmdW5jdGlvbihjKXtjLnBtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHhhOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8Cih0aGlzLnRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMudGIrKywxNTx0aGlzLnRiKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMubmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy55YSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLnhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkhyPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLkhyPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWHUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMucG18fGViOyhmdW5jdGlvbihjKXtjLnJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5ybXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFxPXRoaXMuYVsxXTt0aGlzLmw9dGhpcy5hWzVdfWMubGo9YjtiLnByb3RvdHlwZT17cHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFxOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5sanx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQucHEoNCk7KGZ1bmN0aW9uKGMpe2Mud2s9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5WKGIuZWxlbWVudCl9LFJiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMud2t8fGliOyhmdW5jdGlvbihjKXtjLnZrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PQpiLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCl9fSl9KShjKTt2YXIgamI9Yy52a3x8amI7KGZ1bmN0aW9uKGMpe2MueGs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMueGt8fGtiLGxiPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbz10aGlzLmFbNF07dGhpcy5Gbj10aGlzLmFbNF07dGhpcy5Laz10aGlzLmFbM107dGhpcy56aT10aGlzLmFbMV07CnRoaXMuTnQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMTBdfWMuV2k9YjtiLnByb3RvdHlwZT17Wm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Gbjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5OdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIG1iPWMuV2l8fG1iLHNkPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXNkLlpvKDQpOyhmdW5jdGlvbihjKXtjLlZrPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTt0aGlzLnBoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuUyhnKTt0aGlzLlYoZyk7dGhpcy5kZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kZCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1xOmZ1bmN0aW9uKCl7ZS5UZyh0aGlzLmRkKTtlLnhlKHRoaXMuZGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tcSgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxEZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIG5iPWMuVmt8fG5iOyhmdW5jdGlvbihjKXtjLlVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCEwKX19KX0pKGMpO3ZhciBwYj1jLlVrfHxwYjsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTsKZS5UZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IHBiKGIsdGhpcy5HKSkuYygpKSk7dGhpcy5BYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5BYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcWI9Yy5Xa3x8cWIscmI9bmV3IHFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs5XTt0aGlzLm1sPXRoaXMuYVs3XTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLlRzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuRm09YjtiLnByb3RvdHlwZT17Y3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMucmo6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tbDp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWHI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgc2I9Yy5GbXx8c2IsdGQ9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuY3QoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkNrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEx2OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSwKYil7dGhpcy5kYXRhW2FdPWJ9LFBvOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuQ2t8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5YYT1hO3RoaXMuc2c9dGhpcy5maT0hMTt0aGlzLmpoPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeChhKSk7dmFyIGU9dGhpcy5EYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC5CZSh0aGlzLlhhLnVybCkmJmwuSmQpe3ZhciBoPW5ldyB4KGEudXJsKTsKaC5MdigiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLm5hKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5uYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuRGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuc2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCwKdGhpcy5YYS51cmwsITEpOnRoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy5maXx8KHRoaXMuRGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLkRiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuRGIuc2VuZChhKX1jYXRjaChjKXtsJiZsLkJlKHRoaXMuWGEudXJsKT9sLkpkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuQmUodGhpcy5YYS51cmwpLHRoaXMuamgmJnRoaXMuamgoKX1yZXR1cm4gdGhpcy5EYn19fSkoYyk7dmFyIHRiPWMuRGt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmpjPSIiO3RoaXMuJGQ9dGhpcy5pYz10aGlzLm5iPW51bGw7dGhpcy5McT10aGlzLnliPXRoaXMuWmc9ITE7dGhpcy5HYT0iIjt0aGlzLlZnPSExO3RoaXMuQ2E9CnRoaXMua2Q9IiI7dGhpcy5SZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLkhnPXRoaXMuVGI9IiI7dGhpcy5qZT0hMTt0aGlzLmhmPTA7dGhpcy55Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5FYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVmI9IiI7dGhpcy56Yj1bXTt0aGlzLldiPVtdO3RoaXMuVWI9IiI7dGhpcy5qZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnVlPSExO3RoaXMub3E9dGhpcy5LZD1udWxsO3RoaXMuRmg9dGhpcy5GYz10aGlzLmpnPXRoaXMubmY9dGhpcy5KZD10aGlzLmFlPXRoaXMuSmM9CiExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMubWQ9MDt0aGlzLkpnPSExO3RoaXMuSWc9MUUzfWMuRWs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuc2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5qYyxhZHRhZ21vZGlmaWVyOnRoaXMubmIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmljLGFkdGFncmVnZXg6dGhpcy4kZCxqc3BvcHVwczp0aGlzLlpnLHNpZGVsb2Fkczp0aGlzLnliLGRpc2FibGV0ZXN0czp0aGlzLkxxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuVmcsZ2xvYmFsQ29uZmlnOnRoaXMua2QsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5SZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5UYixob21hZEFkcGF0aDp0aGlzLkhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuamUsCnRlc3RDb29raWVBdHRlbXB0czp0aGlzLmhmLEhPTUFEX1ZFUklGSUVEOnRoaXMueWYsSE9NQURfQkxPQ0tFRDp0aGlzLndmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkViLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy54Zix0ZXN0SGlkZTp0aGlzLlZiLHRlc3RUYWdzOnRoaXMuemIsdGVzdFRhZ3NKUzp0aGlzLldiLHRlc3RDb29raWU6dGhpcy5VYix0aHJvdHRsZTp0aGlzLmpmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMudWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5vcSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5hZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5KZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5TYixzZXJ2ZXJJZDp0aGlzLkFoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5wYywKdnBhaWQ6dGhpcy5GYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuYWl9fSxGczpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LGVzOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLndiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuTXAoYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5zYSYmIWIpcmV0dXJuIG5ldyB4KGEpO2M9dGhpcy5BZShhKTtlPXRoaXMuemEoYSk7Yz8odGhpcy54YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy54ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmpjfHx0aGlzLm5ifHx0aGlzLmljfHx0aGlzLiRkKSYmKGs9dGhpcy5mdShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdzKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5wYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy54YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxCZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkFlKGEpO3JldHVybiBifSxnczpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5yeTtyZXR1cm4ibm9uZSJ9LG5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy5BaF19LHhkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sZmg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sZXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5maChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pOwpCPVtdO2ZvcihsIGluIGMpQi5wdXNoKGwrIj0iK2NbbF0pO2M9Qj1lbmNvZGVVUklDb21wb25lbnQoQi5qb2luKCImIikpfWVsc2UgYz10aGlzLmZoKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9bD1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWwucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sZnU6ZnVuY3Rpb24oYSl7dGhpcy5qYyYmKGErPXRoaXMuamMpO2lmKHRoaXMubmIpZm9yKHZhciBiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5uYltiXSkpO3RoaXMuaWMmJihhPXRoaXMuZXUoYSx0aGlzLmljKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlZnPSEwO3RoaXMua2Q9YTt0aGlzLkNhPWI7dGhpcy5WZT1kO3RoaXMuS2Q9Yzt0aGlzLm5jPWU7dGhpcy5TYj1ofHx7fTt0aGlzLlZ0KCk7aWYoInN0cmluZyI9PQp0eXBlb2YgdGhpcy5DYSl0aGlzLlR0KCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLlljKCl9Y2F0Y2goayl7dGhpcy5uYSgibm9DbGllbnRDb25maWciKX19LGhiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxWdDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5rZCt0aGlzLlFjKCJnbG9iYWwiKSksdGhpcy56cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLlljKCl9LmJpbmQodGhpcyksITApfSxUdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5RYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLlFjKCJjbGllbnQiKSksdGhpcy5ZYy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuWmUoImNsaWVudCIpO3RoaXMubmEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFFjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLndiKCk7dGhpcy5TYiYmdGhpcy5TYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuU2ImJnRoaXMuU2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5uYz0hMSk7dGhpcy5uYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm5jPwp0aGlzLm5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmJhPXRoaXMuUmc9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMud2YpKTt0aGlzLkJiKCk7ZS5xYyhrLlR1KTsoYj1lLmhkKHRoaXMubmQoKSkpfHwoYj1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx6czpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5UYnx8dGhpcy5HYXx8dGhpcy5ZYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKSwKdGhpcy5CYigpKX19LFljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuQ2F9ZWxzZSBhPXRoaXMuQ2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihhLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlRiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5IZz1hLmFkcGF0aHx8IiI7dGhpcy5qZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkFoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVGImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoPwp0aGlzLnFkKCExKToodGhpcy5zYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5CYigpKX0scWQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB4KHRoaXMueGQoKSksZD10aGlzLnphKHRoaXMuVGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5UYit0aGlzLlFjKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5sdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiY3VzdG9tZXIiKTthP3RoaXMuUG0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5QbT0hMCwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxsdzpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe310aGlzLkpkPXRoaXMuWGIoYi5zdHJpY3QpO3RoaXMubmY9dGhpcy5YYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5qZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucGM9dGhpcy5YYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuWGIoYi5lbmFibGVkKTt0aGlzLlZiPWIudGVzdGhpZGV8fCIiO3RoaXMuemI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLldiPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuamM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1iLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuaWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLiRkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlpnPWIuanNwb3B1cHN8fCExO3RoaXMueWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuRmM9Yi52cGFpZHx8ITE7dGhpcy5TYi52cGFpZD10aGlzLkZjO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5WYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYWk9Yi52bWFwc3x8IiI7dGhpcy5VYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBzKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5qZSYmKHRoaXMuVWI9bnVsbCk7dGhpcy5qZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnVlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy51ZT0hMCx0aGlzLnFkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLkl3KCkmJgoodGhpcy5WYnx8dGhpcy5XYnx8dGhpcy56Ynx8dGhpcy5VYik/dGhpcy5WZT8odGhpcy5zYT10aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5lZSgpLHRoaXMuQmIoKSk6dGhpcy5ydygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN3KCkpfX0scnc6ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy50dygpfSx0dzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLndpZHRoPTE7Yy5oZWlnaHQ9MTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3JjPSJhYm91dDpibGFuayI7dmFyIGg9ZS5nYSgxMCksQj1lLmdhKDEwKSxrPWUuZ2EoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGssZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmEoQikrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UucGIoYShoKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChsKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2lmKDMhPWQpe3ZhciBhPWUuaWUoKTshYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5RYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKTt0aGlzLkJiKCl9LElkOmZ1bmN0aW9uKGEpe3RoaXMuSmM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9CnRoaXMuc2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKGEpKSx0aGlzLkJiKCksdGhpcy5lZSgpKX0scXc6ZnVuY3Rpb24oKXtpZih0aGlzLlZiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlZiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuVmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuTmgoKX1lbHNlIHRoaXMuTmgoKX0sCk1oOmZ1bmN0aW9uKCl7dmFyIGM7dmFyIGQ7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpO3RoaXMud3coYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmVmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5JZCh0aGlzLkhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9dGhpcy56Yj1udWxsLHRoaXMuZWYoKX0sd3c6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpOwp0aGlzLnh3KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5NaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5XYiYmdGhpcy5XYi5sZW5ndGgpe3ZhciBjPXRoaXMuV2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSx4dzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LGVmOmZ1bmN0aW9uKCl7dGhpcy5VYj8odGhpcy5oZisrLHRoaXMuSGEobmV3IHgodGhpcy5VYiksdGhpcy5wdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuSWQodGhpcy54ZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmhmP3RoaXMuZWYoKTp0aGlzLmZmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuS2goKTp0aGlzLmZmKCJBQUEiKX0sS2g6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSk7dGhpcy5CYigpO3RoaXMuZWUoKX0sQmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuUWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5KYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMueWYpKTt0aGlzLktkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuS2QmJnRoaXMuS2QoKX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLm5mJiZ0aGlzLkZzKCkpe3ZhciBhPXRoaXMuZXMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFBoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsYixjLGYsaCxCKXt0aGlzLm1kfHwodGhpcy5tZD0wKTt0aGlzLm1kKys7dGhpcy5tZD50aGlzLklnJiYhdGhpcy5KZyYmKHRoaXMuSmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLklnLCEwKSk7YT1uZXcgdGIoYSxiLGMpO2YmJihhLmZpPSEwKTtoJiZlLm10KCkmJihhLnNnPSEwKTtCJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxWZjpmdW5jdGlvbigpe2UuUWEoKXx8ZS5VYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubmEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMueGMoKXx8KGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTsKaC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxvdzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5haX0sa3E6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5oeC5iaW5kKHRoaXMpLAp0aGlzLmd4LmJpbmQodGhpcykpfSxoeDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuQ3IoKX0sZ3g6ZnVuY3Rpb24oKXt9LENyOmZ1bmN0aW9uKCl7ZS5xYyhrLkJyKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLm5hKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxlZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnliLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMueWIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy55YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBSO3dpbmRvd1tjLndjKCldPXRoaXM7ZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLmpmfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sd2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFhiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLHAsbix2LHUsdztwPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHgucHVzaChlKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PAoyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKHA+Pj4yOSk7eC5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO3A9bDtuPW07dj1xO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl3PWMoZSw1KSsocCZufH5wJnYpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStuJjQyOTQ5NjcyOTU7cT1xK3YmNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciB1Yj1jLkVrfHx1YixsPW5ldyB1Yjt3aW5kb3cudWc9bDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adz10aGlzLmFbNF07dGhpcy5XbT10aGlzLmFbMl07dGhpcy5LaT10aGlzLmFbMV07dGhpcy5jdz10aGlzLmFbMl07dGhpcy5rbD10aGlzLmFbNF07dGhpcy5zdD10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbN107CnRoaXMuVnI9dGhpcy5hWzddO3RoaXMuWW09dGhpcy5hWzNdO3RoaXMuWnE9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMl19Yy53bz1iO2IucHJvdG90eXBlPXtZdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnc6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LaTp0aGlzLmJ3KGEpfSxidzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3c6dGhpcy5qbChhKX0samw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtsOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdDp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Wcjp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlltOnRoaXMuWXEoYSl9LApZcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWnE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB2Yj1jLndvfHx2Yix1ZD1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT11ZC5Zdyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLm0uUD90aGlzLlZhPWEubS5QKCk6dGhpcy5WYT0iIjthLm0uUGcmJmEubS5QZyh7cGF1c2U6dGhpcy50ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLkxlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuJHcuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5hYjt0aGlzLnBsYXllcj10aGlzLmIubTt0aGlzLkhiPXRoaXMuVGM9ITE7dGhpcy5LcD0xRTM7dGhpcy5qYT0KbnVsbDt0aGlzLlQ9Yjt0aGlzLnVhPXt9O3RoaXMudmlkZW89e307dGhpcy5HZD17fTtlLmdiKCJuZXdCaWdBZElkIik7dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmJmPTA7dGhpcy5SYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlJjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlJjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuRmQ9ITE7dGhpcy5iaD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuUGM9ITE7dGhpcy5TaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLk1iPSExO3RoaXMuenE9CmUuZ2EoMTApO3RoaXMuUGI9ZS5nYSgxMCk7dGhpcy5PYj1lLmdhKDEwKTt0aGlzLkdoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm9jPXRoaXMudmI9ITE7dGhpcy5tZT1udWxsO3RoaXMuTmQ9dGhpcy5DYj10aGlzLndlPXRoaXMuU2U9dGhpcy5mZT10aGlzLmJkPXRoaXMuZGY9dGhpcy5hYz10aGlzLlBkPXRoaXMubGg9dGhpcy5lZD10aGlzLkt3PXRoaXMua2I9ITE7dGhpcy5lYz1bXTt0aGlzLlliPXt9O3RoaXMua2Y9ITF9Yy55az1iO2IucHJvdG90eXBlPXtCaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pO3JldHVybiBifSxRaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5QYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULkpjP2UudHJhY2soImFkY2FsbCIsIjEiKToKZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay5Mbyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxGZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5rYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmJmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5ULmxxKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLlFoKCksbmV3IFUodGhpcyxhLHRoaXMuYmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5GYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5RaCgpLG5ldyBVKHRoaXMsYSx0aGlzLmJoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULkZjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLAprZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLk1hKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkZlKGEsYixjKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7dGhpcy5OZD10aGlzLkNiPXRoaXMuZWQ9ITE7dGhpcy5nPWE7dGhpcy5Udih0aGlzLmcpO3RoaXMuRWcoYSk7dGhpcy5lYz10aGlzLnZnKGEpO3RoaXMuWWI9e307dGhpcy5rZj0hMX0sRWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5zcyhhKSksdGhpcy5FZyhhLnBhcmVudCkpfSx2ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMudmcoYS5wYXJlbnQpKSwKYy5wdXNoKHRoaXMuJHIoYSkpKTtyZXR1cm4gY30sJHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHNzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlguZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuY2QmJmEuY2QuZXJyb3ImJmEuY2QuZXJyb3IuY29kZSYmKGI9YS5jZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LkdjLmNvZGU6Yj09RC5SZC5jb2RlP2UudyhrLkp4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpOihlLkdlKCksYj09RC5CZi5jb2RlJiZlLncoay5odSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Bcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuemYuY29kZTplLncoay5peCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQ2YuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5OeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS53KGsuUngsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7CmJyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudyhrLml1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMub2N8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkliKGEpO3RoaXMuTWEoKX0sSWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkxhLmxlbmd0aDspdHJ5e3ZhciBjPWEuTGEucG9wKCk7dGhpcy5FZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sVHY6ZnVuY3Rpb24oYSl7dGhpcy5mZT0KdGhpcy53ZT10aGlzLlNlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7dGhpcy5VbyYmdGhpcy5wbGF5ZXIuc2MoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnNjKCkvCjEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuUW8oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLk9oKGIpPyh0aGlzLlNvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy51cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLlJ2KCkpOnRoaXMuemUoKT90aGlzLkRoKCk6dGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0sUnY6ZnVuY3Rpb24oKXt0aGlzLmFjPXRoaXMuUGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuYWM9ITApO2UuJGYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4udGYmJmUuVG8odGhpcy5nLm9yaWdpbi50Zik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCxhKTt0aGlzLmIubWgoKTt0aGlzLmIuQ2MoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYi5DYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLnBmKCJ2cGFpZCIpO3RoaXMuYWMmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTsKdGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnVzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmFxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5ZZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkxiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmVjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMueHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYKKHRoaXMueXgoKSx0aGlzLmIuTGIoITApLCF0aGlzLkNiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLk5kPSEwO2UudyhrLiRoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnllKHRoaXMuQ2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5MYighMCksdGhpcy5DeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuTGIoITApLAp0aGlzLkd4KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSHgoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuYmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcubGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuYWcsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7CmEuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkJ4KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnp4KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLkF4KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5hYz0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5yZCwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYWM9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5tZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuWWQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSk7ZS5ZZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcykpO3RoaXMuYi5ObyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHp4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLlBkPSEwfSxBeDpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLlBkPSExfSxDeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEJ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHl4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuWWEoImltcHJlc3Npb24iKTtlLncoay5IZiwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sR3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sRXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEZ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLkpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5OZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxEeDpmdW5jdGlvbigpe3RoaXMuTGQoKTtlLllhKCJjb21wbGV0ZSIpfSwKYmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5NYShhKX19LHh4OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudyhrLkl4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7CnRoaXMuYmkoITApfSxRbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnhjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy5veC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sU286ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdGhpcy5NZC5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk1kLmJpbmQodGhpcykpfSxaaDpmdW5jdGlvbihhKXt0aGlzLkhifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGJ8fHRoaXMucWYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxxZjpmdW5jdGlvbihhKXtpZighdGhpcy5UYyYmdGhpcy5PaCh0aGlzLnZpZGVvKSYmIXRoaXMudmImJiF0aGlzLkhiKXt0aGlzLlRjPQohMDt0cnl7aWYoIWUuUWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudmJ8fCh0aGlzLnZiPSEwLHRoaXMueWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmpnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5NYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLm54KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQ2MoKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMuUmYoKTt0aGlzLmIubWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuY2YoKX19LGNmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmQpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJgooYT1hKGUuUGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMubGQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmxkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuTmMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTmMoKX1lbHNlIHRoaXMuTmMoKX0sTmM6ZnVuY3Rpb24oYSl7aWYodGhpcy5sZClmb3IodmFyIGI9MDtiPHRoaXMubGQubGVuZ3RoO2IrKyl0aGlzLmxkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmJkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5NYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkxlKCEwKSx0aGlzLk5jKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLndlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5TZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlFiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuUWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUWIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLlBjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5jZigpKX0uYmluZCh0aGlzKTt0aGlzLnBlKCkuQ2godGhpcyl9LExkOmZ1bmN0aW9uKCl7dGhpcy5ULnBjJiYhdGhpcy52YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLklvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5NYSgpfSxNYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSlpZih0aGlzLmZlPSEwLHRoaXMuTmR8fChlLncoay5sdSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5qYnx8dGhpcy5nLmNjKXtlLmdiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmJmKys7dGhpcy5IYj10aGlzLlRjPSExO3RyeXt0aGlzLnlkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5GZD0hMTt0cnl7dGhpcy5iLlVoKCl9Y2F0Y2goaCl7fXRoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5NYj0hMTt0aGlzLnBlKCkueGgoKTsKdGhpcy5nLmpiJiZ0aGlzLmcub3JpZ2luLk1lKCk7dGhpcy5nLmNjJiYoYT90aGlzLmcub3JpZ2luLmdoKCk6dGhpcy5nZSgpKX1lbHNlIHRoaXMuZ2UoKX0sb3g6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy55ZCh0aGlzLnZpZGVvKSx0aGlzLnplKCk/dGhpcy5EaCgpOnRoaXMuTWQoYSkpfSxNZDpmdW5jdGlvbihhKXt0aGlzLkhiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnplKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9jfHx0aGlzLlQuVmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZigpKTsKdGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0scmY6ZnVuY3Rpb24oKXtpZih0aGlzLkt3KXRoaXMuTWEoKTtlbHNle3RoaXMuTWI9ITA7dGhpcy5iLm0uUmEmJiF0aGlzLmRmJiZ0aGlzLmIubS5SYSgpJiZlLncoay4kYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5QdyhhKTtpZighdGhpcy5DYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5OZD0hMDtlLncoay4kaCx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UueWUodGhpcy5DYil9Yz0iIjt0aGlzLmcuYWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGM9dGhpcy5nLmFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkZkfHwodGhpcy5GZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5MZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5qYj8odGhpcy5IYj10aGlzLlRjPSExLHRoaXMueWQodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRmQ9ITEsdGhpcy5iLlVoKCksdGhpcy5nLm9yaWdpbi5NZSgpKTp0aGlzLk1hKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlJjLnJlcGxhY2UoIlt0aW1lXSIsZS50Zyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLlBjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMub2M9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkNjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlloLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMubWU9c2V0SW50ZXJ2YWwodGhpcy5qcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG5zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgueGMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LGpxOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5tZSksdGhpcy5MZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnJmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm1lKSx0aGlzLk1kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFJoOmZ1bmN0aW9uKCl7dGhpcy5saHx8KHRoaXMubGg9ITAsdGhpcy5lZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFB3OmZ1bmN0aW9uKGEpe2UudyhrLlhkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5TaHx8dGhpcy52Ynx8KDA9PWEmJih0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKSx0aGlzLlNlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLndlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlJoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5IZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5vYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULnBjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5lZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk5mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuU2g9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudmIpe3RyeXtpZih0aGlzLlliW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuWWIuaW1wcmVzc2lvbiYmdGhpcy5ZYi5jb21wbGV0ZSYmIXRoaXMua2Ype3RoaXMua2Y9ITA7dmFyIGM9dGhpcy5ZYi5jb21wbGV0ZS0KdGhpcy5ZYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmKDEwPmMmJihjPTEwKSwwPmMmJihjPSJuZWdhdGl2ZSIpLGUudHJhY2soZixjLCEwKSl9fWNhdGNoKGgpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9Yz1bXTt0cnl7Yz10aGlzLnRzKHRoaXMuZy5MYSxhKX1jYXRjaChsKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgbT1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5HZC5pbXByZXNzaW9ucyYmZS5rdChtLnVybCx0aGlzLkdkLmltcHJlc3Npb25zKT90aGlzLkVlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5Lbyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHthZElkOnRoaXMuR2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuRCgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKG0udXJsLG0udHlwZSl9Y2F0Y2gocil7fWlmKCFiKXRyeXt0aGlzLmcuTGE9dGhpcy5GcSh0aGlzLmcuTGEsYSl9Y2F0Y2gobil7fX19LEVlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuVC53YShhKSxjJiZhLlBvKGMpLGZ8fChmPXRoaXMuaWcpLHRoaXMuVC5IYShhLGYsdGhpcy5pZywhMSwhMCkpfSx0czpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LEZxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LG54OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLlloLmJpbmQodGhpcyl9LApZaDpmdW5jdGlvbigpe2UudyhrLmFnLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLmVkJiZlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLmFzKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5zYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5nLmxjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMuZy5sYyx0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKX19LmJpbmQodGhpcyksMjAwKX0sWGg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPQp0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuUmMucmVwbGFjZSgiW3RpbWVdIixlLnRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlQuVmMmJihiPXRoaXMuVC5WYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy50Yy5iaW5kKHRoaXMpLDFFMyoKYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSx0YzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy56cTt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5EZCgpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnVjKCk7dGhpcy50YygpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5QYjtjLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Pdy5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk53LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRGQoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy51YygpO3RoaXMudGMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLk9iO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTXcuYmluZCh0aGlzKSk6Zi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mdy5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2guaWQ9dGhpcy5HaDtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2guaW5uZXJIVE1MPSIiO2IuYXBwZW5kQ2hpbGQoYyk7dGhpcy5nLmFmJiZiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoZik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpOwp0aGlzLmNvbnRyb2xzPXRoaXMuamEuYXBwZW5kQ2hpbGQoYik7InZwYWlkIiE9YSYmdGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuTGUoKSk7dGhpcy51YygpfX0sdWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxEZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxOdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYi5ILnBhdXNlZD8odGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsCiEwKSxlLncoay5WZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT3c6ZnVuY3Rpb24oKXt0aGlzLlBkP2Uub2EodGhpcy5PLCJjb250cm9sIiwicGxheSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwicGF1c2UiKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmIuSC5wYXVzZWR8fCh0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5iLkgucGF1c2VkJiYodGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKSl9LEx3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWQ/KHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYi5ILm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudyhrLnJkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxNdzpmdW5jdGlvbigpe3RoaXMuYWM/ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJ1bm11dGUiKTplLm9hKHRoaXMuTywiY29udHJvbCIsIm11dGUiKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWR8fCh0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5yZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sJHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKTt0aGlzLmIuSC5tdXRlZCYmKHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LFFiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLAp0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5RYik7dGhpcy5iZHx8dGhpcy5QY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuY2YoKSl9LGdlOmZ1bmN0aW9uKCl7dGhpcy5iZD0hMDt0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKTtpZigoInByZXJvbGwiPT1lLlBhJiZ0aGlzLlBjfHwicG9zdHJvbGwiPT1lLlBhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlBhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkw7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5DYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwpjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5oZSgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLmhlKCl9ZWxzZSB0aGlzLmhlKCl9LApoZTpmdW5jdGlvbigpe3RoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5iLkJ2KCk7dGhpcy5NYj0hMTtlLncoay55cSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMucGUoKS54aCgpfSxwZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIubSYmKGE9dGhpcy5iLm0pO3JldHVybiBhfSx6ZTpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFJmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUueGUodGhpcy52aWRlbywKYSk/dGhpcy55aCgpOnRoaXMudGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuZy5sYyxhLmR1cmF0aW9uPXRoaXMuZy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuZy5qYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLmVjJiYwPHRoaXMuZWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLmVjKSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlhwKyItIit0aGlzLmJmO3RoaXMuZyYmdGhpcy5nLnpnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuZy56ZygpKTtyZXR1cm4gYX0saWc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBQPWMueWt8fFA7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5sPXRoaXMuYVsxXTt0aGlzLkJvPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVs5XTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLnp1PXRoaXMuYVs5XTt0aGlzLlFyPXRoaXMuYVszXTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzVdfWMua3U9YjtiLnByb3RvdHlwZT17TWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk5sOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Cbzp0aGlzLmZtKGEpfSxmbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ206dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhxOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56dTp0aGlzLlByKGEpfSxQcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXI6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5Mczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB3Yj1jLmt1fHx3Yix2ZD1uZXcgd2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT12ZC5NbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkJhPW51bGw7dGhpcy5aPVtdO3RoaXMuWD1udWxsO3RoaXMuZGM9dGhpcy5mYz0hMTt0aGlzLnRmPSIiO3RoaXMuc2Y9ITE7ZCYmZC5lbXB0eT90aGlzLll0KCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MuS249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmllKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHgodGhpcy51cmwpOmwud2EobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlFhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZXx8Yyl7YT1lLmRnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC53YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLndhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSJ9bC5IYShiLHRoaXMuWHQuYmluZCh0aGlzKSx0aGlzLlV0LmJpbmQodGhpcykpfSx3ZzpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuQmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlBhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChkKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGYpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5QYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUGF8fHRoaXMub3QoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwub3coKSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sb3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxYdDpmdW5jdGlvbihhKXt0aGlzLnJ2KGEpO3RyeXt0aGlzLkJhPWEucmVzcG9uc2VYTUwsdGhpcy5CYXx8KHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5OYSh3LlNkKSl9dGhpcy5aPXRoaXMud2coKTt0aGlzLmZjPXRoaXMuZ2YoKTt0aGlzLmRjPXRoaXMuTGgoKTt0aGlzLloubGVuZ3RoP3RoaXMuemMoKTp0aGlzLnJhKHRoaXMuTmEody5HYyx7ZXJyb3I6dGhpcy5zZj9ELlJkOkQuQWZ9KSl9LFl0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwKKHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk5hKHcuU2QpKX10aGlzLlo9dGhpcy53ZygpO3RoaXMuZmM9dGhpcy5nZigpO3RoaXMuZGM9dGhpcy5MaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy56YygpOnRoaXMucmEodGhpcy5OYSh3LkdjLHtlcnJvcjp0aGlzLnNmP0QuUmQ6RC5BZn0pKX0sVXQ6ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuTmEody56Zix7ZGVwdGg6YX0pKX0semM6ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5aLnNoaWZ0KCk7dGhpcy5xdCgpP3RoaXMueXcoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5GZygpLGcse0FkU3lzdGVtOnRoaXMuWnIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5yYSh0aGlzLk5hKHcuQ2YpKTooYT0wLHRoaXMuZXgoKSYmdGhpcy5RZSh0aGlzLkFxKCkpKX0sTWU6ZnVuY3Rpb24oKXt0aGlzLmZjPyh0aGlzLmZjPTE8dGhpcy5aLmxlbmd0aCwKdGhpcy5aLmxlbmd0aCYmdGhpcy56YygpKTp0aGlzLnBhcmVudC5NZSgpfSxnaDpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMuZGM9MTx0aGlzLloubGVuZ3RoLHRoaXMuWi5sZW5ndGgmJnRoaXMuemMoKSk6dGhpcy5wYXJlbnQuZ2goKX0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52dygpP3RoaXMudXcoKT8hMDooLTEhPXRoaXMucmMoKT90aGlzLnJhKHRoaXMuTmEody52ZikpOnRoaXMucmEodGhpcy5OYSh3LnpqKSksITEpOih0aGlzLnJhKHRoaXMuTmEody5HYyxELkJmKSksITEpfSxRZTpmdW5jdGlvbihhKXthLkxhPWEuTGEuY29uY2F0KHRoaXMuSWUoKSk7YS5qYj1hLmpiP2EuamI6dGhpcy5mYzthLmNjPWEuY2M/YS5jYzp0aGlzLmRjO3RoaXMucGFyZW50LlFlKGEpfSxBcTpmdW5jdGlvbigpe3ZhciBhPW5ldyB4YjthLmR1cmF0aW9uPXRoaXMucmMoKTthLlU9dGhpcy5DZygpO2EubGM9dGhpcy5icygpO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuWXIoKTthLmFmPXRoaXMucnMoYS5kdXJhdGlvbik7CnJldHVybiBhfSxyYTpmdW5jdGlvbihiKXt0aGlzLlgmJihiLkxhPWIuZXJyb3IuY29kZSE9dy52Zi5jb2RlP2IuTGEuY29uY2F0KHRoaXMuY3MoKSk6Yi5MYS5jb25jYXQodGhpcy5scygpKSk7dGhpcy5aLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkliJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuSWImJnRoaXMucGFyZW50LkliKGIpLGE9MCx0aGlzLnpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYiksYT0wKX0sSWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuSWIoYSl9LGtnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLk5hKGEsYikpfSxOYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB5YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LHl3OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sdnc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkNnKCkubGVuZ3RofSwKdXc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnJjKCl9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sTGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlomJjI8PXRoaXMuWi5sZW5ndGgmJiF0aGlzLmdmKCkmJihhPSEwKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxxdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LEZnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJBZFN5c3RlbSIpfSxJZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLlNnKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmJiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5TZyhhLnBhcmVudE5vZGUpOiExfSxsczpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LENnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksVWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHR5OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLAp1cmw6dGhpcy5iYihhW2NdKX0pO3RyeXt2YXIgZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksYj1kLmNvbmNhdChnKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz0KYj10aGlzLmpkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxyYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmJiKHRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scnM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5kdyhkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJgoib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmpkKGEpOiIifSxqZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5Lbnx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meT10aGlzLmFbNl07dGhpcy5acz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtleTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmZ5OnRoaXMuWXMoYSl9LFlzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5aczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMudml8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLmV5KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5VPVtdO3RoaXMubGM9IiI7dGhpcy5CPXRoaXMuY2M9dGhpcy5qYj0hMTt0aGlzLnRlPXRoaXMub3JpZ2luPW51bGx9Yy51bT1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxqczpmdW5jdGlvbigpe2lmKCF0aGlzLnRlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSwKYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnRlPWFbY10pfXJldHVybiB0aGlzLnRlfSx6ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5qcygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx1czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMudW18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVs0XTt0aGlzLldwPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzRdfWMuVnE9YjtiLnByb3RvdHlwZT17UGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFqOnRoaXMuVnAoYSl9LFZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XcDoKdGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYj1jLlZxfHxBYix4ZD1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT14ZC5Qaig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LHpqOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxHYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnRhOiJFTVBUWV9WQVNUIn0sQ2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHpmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp0YToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIix0YToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LGp5Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHRhOiJNRURJQUZJTEVfRVJST1IifSx2Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17QWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sbHk6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHRhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVnU9dGhpcy5hWzldO3RoaXMucWs9dGhpcy5hWzNdO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlF4PXRoaXMuYVs2XTt0aGlzLkF0PXRoaXMuYVsyXTt0aGlzLlBuPXRoaXMuYVsyXTt0aGlzLlhzPXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVszXTt0aGlzLm92PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzhdfWMuZ3k9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZ1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xazoKdGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuUHgoYSl9LFB4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ReDp0aGlzLnp0KGEpfSx6dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXQ6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBuOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Yczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm92OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgQmI9Yy5neXx8QmIseWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9eWQuVXUoNCk7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuY2Q9Yjt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Yaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHliPWMuWGp8fHliO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ5PXRoaXMuYVs1XTt0aGlzLlZ3PXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzldfWMudHQ9YjtiLnByb3RvdHlwZT17YXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ5OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIENiPWMudHR8fENiLHpkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT16ZC5heSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLm09YTt0aGlzLmFiPWEueGcoKTt0aGlzLkw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5MLmlkPWUuZ2EoMTApO3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkE9e307dGhpcy5iZT0hMTt0aGlzLm9iPVtdfWMuRmo9YjtiLnByb3RvdHlwZT17dWc6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxmPTAsYj0wLGU9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9Yi5sZWZ0LGI9Yi50b3ApO2U9e3g6ZiwKeTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudWcoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk5zKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYKKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodzpmdW5jdGlvbigpe3RoaXMuYmU9ITB9LFVoOmZ1bmN0aW9uKCl7dGhpcy5IPUMucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkguaWQ9ImFkWGRpc3BsYXkiLHRoaXMuSC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxtaDpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLiRjLHRoaXMubS52KCkpfSxCdjpmdW5jdGlvbigpe3RoaXMuYmV8fCh0aGlzLm0ucGxheSgpLGUudyhrLmFkLHRoaXMubS52KCkpKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMubS5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0KImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5MLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5MLnN0eWxlLmJveFNpemluZz10aGlzLmFiLnN0eWxlLmJveFNpemluZzt0aGlzLkwuc3R5bGUud2lkdGg9dGhpcy5hYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmFiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5hYik7dGhpcy5tLlJiJiZ0aGlzLm0uUmIoKT90aGlzLm0ueGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMubS5leGl0RnVsbHNjcmVlbigpfSwKTnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG1nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZyh0aGlzLmFiKTtpZihiLnghPXRoaXMuQS54fHxiLnkhPXRoaXMuQS55fHxiLnBvc2l0aW9uIT10aGlzLkEucG9zaXRpb258fGIud2lkdGghPXRoaXMuQS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuQS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5BLndpZHRoJiYKMDx0aGlzLkEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZSgpO3JldHVybn10aGlzLkE9Yjt0aGlzLm0uUmIoKT8odGhpcy5MLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5MLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuTC5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9iLmxlbmd0aDthKyspdGhpcy5vYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkhoKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTGIuYmluZCh0aGlzKSwxMCl9LE5vOmZ1bmN0aW9uKGEpe3RoaXMub2J8fAoodGhpcy5vYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMub2IucHVzaChhKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLkwmJnRoaXMuTC5wYXJlbnROb2RlJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5MKTt0aGlzLkgmJnRoaXMuSC5wYXVzZSYmdGhpcy5ILnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLkZqfHxPLEM9W10sRGI9MDsxMDA+RGI7RGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUuZ2EoMTApO0wuY29udHJvbHM9ITA7Qy5wdXNoKEwpfXZhciBIPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCnopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlN1PXRoaXMuYVsxXTt0aGlzLlh2PXRoaXMuYVs3XTt0aGlzLmdxPXRoaXMuYVs3XTt0aGlzLmVwPXRoaXMuYVsxXTt0aGlzLmZrPXRoaXMuYVs2XTt0aGlzLkV3PXRoaXMuYVs3XTt0aGlzLnF2PXRoaXMuYVs1XTt0aGlzLk1qPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuTXM9YjtiLnByb3RvdHlwZT17UnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlN1OnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mazp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkV3OnRoaXMucHYoYSl9LHB2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xdjp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYj1jLk1zfHxFYixBZD1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1BZC5SdSg0KTsoZnVuY3Rpb24oYyl7Yy5rbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWQoYik7CnRoaXMuZ2coKX0sQWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuRmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBGYj1jLmttfHxGYjsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkdiPXRoaXMuR2J8fCExO3RoaXMuSWY9dGhpcy5LZj10aGlzLk9nPXRoaXMucWE9dGhpcy5sZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcihhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubGY9ITA7dGhpcy5PZyYmdGhpcy5aZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnNiO2EmJmEuTWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5XYygpO3RoaXMuT2c9ITA7dGhpcy5aZigpfS5iaW5kKHRoaXMpKTt0aGlzLlRmKCl9LFpmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2Ipe3RoaXMuV2MoKTtpZighdGhpcy5sZiYmIXRoaXMuV2MoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5sZiYmdGhpcy5JZiYmIXRoaXMuS2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxXYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sRGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sVGY6ZnVuY3Rpb24oKXtpZih0aGlzLldjKCkpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5LZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLklmPWIucXl9dGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRmKCl9LmJpbmQodGhpcyksMTAwKX0sdXk6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuR3koKTohMX0scmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnJjKCk6LTF9LG1zOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElyOmZ1bmN0aW9uKGIsYSl7dGhpcy5HYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkdifHwzMDI9PXRoaXMuR2I/dGhpcy5xYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuR2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT8odGhpcy5zKCksdGhpcy5lYSgpKTpiLm9kKCk/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXMoYik/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgR2I9Yy5qbXx8R2I7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxudDpmdW5jdGlvbigpe3dpbmRvdy5PTy5DbS56by54bz93aW5kb3cuT08uQ20uem8ueG8ub3koZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuT2EoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEZiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBHYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgSGI9Yy5sbXx8SGIsSWI9bmV3IEhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml5PXRoaXMuYVszXTt0aGlzLlRsPXRoaXMuYVs2XTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLmdyPXRoaXMuYVs2XTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzddfWMuR2k9YjtiLnByb3RvdHlwZT17aHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml5OnRoaXMuU2woYSl9LApTbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGw6dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncjp0aGlzLmhyKGEpfSxocjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaXI6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYj1jLkdpfHxKYixCZD1uZXcgSmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1CZC5oeSg0KTsoZnVuY3Rpb24oYyl7Yy5paj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuR2coKX0sR2c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmCihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKbGE6ZnVuY3Rpb24oKXt0aGlzLnNoKCl9LHNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5OJiYoMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgS2I9Yy5panx8S2I7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sVWY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy5zKCJlbXB0eSIpLHRoaXMuZWEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5lYSgpOnRoaXMudSgpKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuVWYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5oanx8TGI7KGZ1bmN0aW9uKGMpe2Muamo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8CihiLkFkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLksoYiksKG5ldyBMYihiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLktyfHwodGhpcy5Lcj0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMudmgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5qanx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkV1PXRoaXMuYVsxXTt0aGlzLnRuPXRoaXMuYVs5XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs4XTt0aGlzLmt4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVs5XX1jLkJwPWI7Yi5wcm90b3R5cGU9e0R1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudG46dGhpcy5WaihhKX0sVmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xajp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTXI6dGhpcy5qeChhKX0sang6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5CcHx8TmIsQ2Q9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPUNkLkR1KDQpOyhmdW5jdGlvbihjKXtjLmVuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7CnZhciBXPWMuZW58fFc7KGZ1bmN0aW9uKGMpe2MuZG49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5RZigiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuUWYoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5xdShhKX0uYmluZCh0aGlzKSk7eS5FcygpfSxxdTpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLnMoKTt0aGlzLmVhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPwohMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBYPWMuZG58fFg7KGZ1bmN0aW9uKGMpe2MuZm49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuc2QmJihiPWUuS3EoYix0aGlzLnNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFcoZCk7CmlmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuc2R8fCh0aGlzLnNkPVtdKSx0aGlzLnNkLnB1c2goYlthXSksZD1uZXcgVyhoKSx0aGlzLkooZCl8fCh0aGlzLksoZCksZj1uZXcgWChkLHRoaXMuRyksZi5jKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxRZjpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSx6dzpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYKIXRoaXMuZGFbYV0pdGhpcy55Y3x8KHRoaXMueWM9W10pLHRoaXMueWMucHVzaChiKSx0aGlzLkF2KCkmJih0aGlzLnpkKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEVzOmZ1bmN0aW9uKCl7aWYodGhpcy55Yylmb3IodmFyIGI9MDtiPHRoaXMueWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy55Y1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmRhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5kYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lnp3KGIpfX0pfSkoYyk7dmFyIE9iPWMuZm58fE9iLHk9bmV3IE9iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWs9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzhdO3RoaXMuU209dGhpcy5hWzFdO3RoaXMuZnY9dGhpcy5hWzFdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuRXI9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzddO3RoaXMuVWk9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtsazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWs6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hdzp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZ2OnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydzp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU3E6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVyOnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5SdDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYj1jLnNqfHxQYixEZD1uZXcgUGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KRGQubGsoNCk7KGZ1bmN0aW9uKGMpe2MuZWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLmVqfHxRYjsoZnVuY3Rpb24oYyl7Yy5maj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMucygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUmI9Yy5manx8UmI7KGZ1bmN0aW9uKGMpe2MuZ2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgUWIoZCk7dGhpcy5KKGUpfHwodGhpcy5LKGUpLChuZXcgUmIoZSx0aGlzLkcpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5nanx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRpPXRoaXMuYVsyXTt0aGlzLnVwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzJdfWMuanI9YjtiLnByb3RvdHlwZT17Q2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYj1jLmpyfHxVYixFZD1uZXcgVWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1FZC5DaSg0KTsoZnVuY3Rpb24oYyl7Yy5YbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlMoYik7dGhpcy5WKGEpO3RoaXMudHYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdHY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiYKdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFBnOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIFZiPWMuWGx8fFZiOyhmdW5jdGlvbihjKXtjLldsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5laT0hMX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5laSYmKHRoaXMuRigpLHRoaXMuZWk9ITAsdGhpcy5LYSgpKTthLkZhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRigpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBXYj1jLldsfHxXYjsoZnVuY3Rpb24oYyl7Yy5ZbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBWYihiW2RdKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBXYihjLHRoaXMuRykpLmMoKSl9fWVsc2UgdGhpcy5JKCl9fSl9KShjKTt2YXIgWGI9Yy5ZbHx8WGIsWT1uZXcgWGIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWo9dGhpcy5hWzZdO3RoaXMueXA9dGhpcy5hWzJdO3RoaXMuQ3E9dGhpcy5hWzddO3RoaXMua2s9dGhpcy5hWzFdO3RoaXMuQm09dGhpcy5hWzhdO3RoaXMuWXg9dGhpcy5hWzVdO3RoaXMueWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuRnQ9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklqOnRoaXMueHAoYSl9LAp4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuQnEoYSl9LEJxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DcTp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua2s6dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJtOnRoaXMuWHgoYSl9LFh4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ZeDp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYj1jLkZ0fHxZYixGZD1uZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1GZC5Iaig0KTsoZnVuY3Rpb24oYyl7Yy5Sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgWmI9Yy5Sbnx8WmI7KGZ1bmN0aW9uKGMpe2MuUW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sSmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5XYXx8KHRoaXMuV2E9W10pO3RoaXMuV2EucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5lYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLmdjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxjOmZ1bmN0aW9uKCl7dGhpcy51KCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnhhP3RoaXMuc3YodGhpcy54YSk6KHRoaXMueGE9dGhpcy5KYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCkpfSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnhhKXt0aGlzLkYoKTtyZXR1cm59aWYoIXRoaXMuZ2Mpe3RoaXMuRigpO3JldHVybn1iPSEwO2lmKHRoaXMuV2EmJgp0aGlzLldhLmxlbmd0aCYmMTx0aGlzLldhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuV2EubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuV2FbYV0mJjMwMyE9dGhpcy5XYVthXSYmNDAzIT10aGlzLldhW2FdJiYoYj0hMSk7aWYoYil0aGlzLnMoImVtcHR5IiksdGhpcy5lYSgpO2Vsc2V7dGhpcy5GKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgJGI9Yy5Rbnx8JGI7KGZ1bmN0aW9uKGMpe2MuU249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5JYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBaYihiLml0ZW0oYSkpO3RoaXMuSihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSyhjKSwKKG5ldyAkYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgYWM9Yy5Tbnx8YWMsYmM9bmV3IGFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl1PXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs2XTt0aGlzLkN0PXRoaXMuYVsxMF07dGhpcy5wcj10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuYXI9dGhpcy5hWzFdO3RoaXMuaXY9dGhpcy5hWzldO3RoaXMudXI9dGhpcy5hWzZdO3RoaXMuZ3A9dGhpcy5hWzZdO3RoaXMucnI9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudXQ9YjtiLnByb3RvdHlwZT17SHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkl1OnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HdTp0aGlzLkJ0KGEpfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Q6dGhpcy5vcihhKX0sCm9yOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wcjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFyOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pdjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXI6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdwOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNjPWMudXR8fGNjLEdkPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUdkLkh1KDQpOyhmdW5jdGlvbihjKXtjLmJsPQpuLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTiYmKDAsdGhpcy5OKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBkYz0KYy5ibHx8ZGM7KGZ1bmN0aW9uKGMpe2MuYWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5yZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NbygpfS5iaW5kKHRoaXMpKSx0aGlzLmRpPSExLHRoaXMuS3g9MUUzLAp0aGlzLm9oPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxyZzpmdW5jdGlvbigpe3RoaXMub2guZG9uZXx8KHRoaXMub2guZG9uZT0hMCx0aGlzLmRpPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jaSgpfS5iaW5kKHRoaXMpLHRoaXMuS3gpKX0sTW86ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGkpO3RoaXMucygpfSxjaTpmdW5jdGlvbigpe3RoaXMueWEoKT8odGhpcy5zKCksdGhpcy5lYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRigpKX0sQWc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5BZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLkFnKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBlYz1jLmFsfHxlYzsoZnVuY3Rpb24oYyl7Yy5jbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuT2Eod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGRjKGMpLHRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IGVjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGZjPWMuY2x8fGZjLGdjPW5ldyBmYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW49dGhpcy5hWzhdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMuTXg9dGhpcy5hWzddO3RoaXMucmw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudnU9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbTp0aGlzLkx4KGEpfSxMeDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXg6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgaGM9Yy52dXx8aGMsSGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLlRuKDQpOyhmdW5jdGlvbihjKXtjLmJuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBpYz1jLmJufHxpYzsoZnVuY3Rpb24oYyl7Yy5hbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMua2MoKX0sa2M6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5DZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2MoKX0uYmluZCh0aGlzKSwxMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LAp1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5hbnx8amM7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBpYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgamMoYiwKdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLmNufHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbOV19Yy5paT1iO2IucHJvdG90eXBlPXtPbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmlpfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5PbCg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuUmU9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLll1KCl9LmJpbmQodGhpcyksNTAwKX0sWXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuUmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuUmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxldzpmdW5jdGlvbigpe3RoaXMuUmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLk5tfHxuYzsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuJGI9MH0sYzpmdW5jdGlvbigpe3RoaXMuY3U9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy4kYnx8KHRoaXMuJGI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy4kYnx8dGhpcy4kYisrLHRoaXMuJGI8PXRoaXMuY3U/KHRoaXMuJGIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmV3KCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgb2M9Yy5NbXx8b2M7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBwYz1jLk9tfHxwYyxxYz1uZXcgcGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHA9dGhpcy5hWzhdO3RoaXMuV249dGhpcy5hWzhdOwp0aGlzLm14PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLmR4PXRoaXMuYVs2XTt0aGlzLmZ0PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLnl0PXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMubnc9YjtiLnByb3RvdHlwZT17Q3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Xbjp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubXg6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFpOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5keDp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRyOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgcmM9Yy5ud3x8cmMsSmQ9bmV3IHJjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9SmQuQ3AoNCk7KGZ1bmN0aW9uKGMpe2MuS209bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLk4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgc2M9Yy5LbXx8c2M7KGZ1bmN0aW9uKGMpe2MuSm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7CmEmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuS2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52cSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmdkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5TdCgpOnRoaXMua2MoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSx2cTpmdW5jdGlvbigpe3RoaXMuR2YoKXx8dGhpcy51KCEwKX0sU3Q6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZCgpOyFiLnZhJiZiLlomJmIubnkmJmIucHkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfSxrYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtjKCl9LmJpbmQodGhpcyksMTAwKX0sZ2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5raClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKS5pZCwKYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLmtoPWJbY10pO3JldHVybiB0aGlzLmtofSxDZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSx1OmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5nZCgpLmFkc0xvYWRlcj90aGlzLkYoITApOnRoaXMuRigpOnRoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB0Yz1jLkptfHx0YzsoZnVuY3Rpb24oYyl7Yy5MbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBzYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IHRjKGMsdGhpcy5HKSkuYygpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIHVjPWMuTG18fHVjLHZjPW5ldyB1YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbM107dGhpcy5oaT10aGlzLmFbMTBdO3RoaXMuWW89dGhpcy5hWzEwXTt0aGlzLlF1PXRoaXMuYVsxMF07dGhpcy53dD10aGlzLmFbNV07dGhpcy5IbT10aGlzLmFbN107dGhpcy5NdT10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsyXX1jLkF3PWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWk6dGhpcy5naShhKX0sZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhpOnRoaXMuWG8oYSl9LApYbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWW86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlF1OnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53dDp0aGlzLkdtKGEpfSxHbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSG06dGhpcy5MdShhKX0sTHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5NdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHdjPWMuQXd8fHdjLEtkPW5ldyB3YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUtkLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKRSYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuVihhKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYjpmdW5jdGlvbigpe3JldHVybiEwfSxGYTpmdW5jdGlvbigpe3ZhciBiO0U/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFo9Yy52bHx8WjsoZnVuY3Rpb24oYyl7Yy51bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5UZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlRlPWIuaWQpO0U/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlRlJiZiIT10aGlzLlRlfHwiYWRlcnJvciIhPWEuZXZlbnR8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm8oImFkZXJyb3IiLGEuSXkpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYWE9Yy51bHx8YWE7KGZ1bmN0aW9uKGMpe2Mud2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihFKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFooYiksYi5tYXx8dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBaKGIpLGIubWE/dGhpcy56ZCgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEUseGM9Yy53bHx8eGMseWM9bmV3IHhjKGZ1bmN0aW9uKGMsYil7Yy5wYXVzZSgpO2lmKGwueWIubGVuZ3RoKXt2YXIgYT1sLnliLnNoaWZ0KCk7CmlmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9ZS5Pdih7IltMT0FEU0NSSVBUXSI6ZS5nYSgxMCksIltVVElMU10iOmUuZ2EoMTApLCJbQ0FMTEJBQ0tdIjplLmdhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS5haC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuYWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHEoYyxiKX1lbHNlIHEoYyxiKX0pO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ4PXRoaXMuYVs4XTt0aGlzLlJ3PXRoaXMuYVs4XTt0aGlzLmt3PQp0aGlzLmFbMl07dGhpcy5lbz10aGlzLmFbNV07dGhpcy50bT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs5XX1jLlJrPWI7Yi5wcm90b3R5cGU9e1V4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WeDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnc6dGhpcy5pdyhhKX0saXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmt3OnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lbzp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudG06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yz1jLlJrfHx6YyxMZD1uZXcgemMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1MZC5VeCg0KTsoZnVuY3Rpb24oYyl7Yy54bj0Kbi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlYoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmd1PWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxPeTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiYKYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuTiYmdGhpcy5OKCkpfX0pfSkoYyk7dmFyIE09Yy54bnx8TTsoZnVuY3Rpb24oYyl7Yy53bj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8KHRoaXMudGI9MCksdGhpcy50YisrLDE1PHRoaXMudGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuUXYoKToKdGhpcy51KCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5uZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTj1jLndufHxOOyhmdW5jdGlvbihjKXtjLnluPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSkpO3RoaXMuemQoKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnlufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHI9CnRoaXMuYVsxMF07dGhpcy5FcT10aGlzLmFbN107dGhpcy5uaj10aGlzLmFbMl07dGhpcy53aj10aGlzLmFbNF07dGhpcy51aj10aGlzLmFbMV07dGhpcy53cD10aGlzLmFbNl07dGhpcy5CaT10aGlzLmFbMTBdO3RoaXMubXY9dGhpcy5hWzddO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMV19Yy5Gaz1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHI6dGhpcy5EcShhKX0sRHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5FcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmo6dGhpcy52aihhKX0sdmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53ajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndwOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CaToKdGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5MbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIENjPWMuRmt8fENjLE1kPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU1kLmtyKDQpOyhmdW5jdGlvbihjKXtjLm9sPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmVnPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuZmEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVnfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTj8oMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7YnE6ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5lZz1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7YnE6ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpOwp2YXIgRGM9Yy5vbHx8RGM7KGZ1bmN0aW9uKGMpe2Mubmw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTXk6ZnVuY3Rpb24oKXt9LHZ2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWYobmV3IGZ1bmN0aW9uKCl7fSk7YS5reT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi52dihhKTt3aW5kb3cuYmU9Yn0sYzpmdW5jdGlvbigpe3RoaXMudXZ8fCh0aGlzLnV2PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmV8fCh0aGlzLnZlPTEpO2lmKDIwPHRoaXMudmUpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmCihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuU2EoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy52ZSsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTApfX0sU2E6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLm8oImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlkoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LAp1OmZ1bmN0aW9uKGIpe3RoaXMuRihiKX19KX0pKGMpO3ZhciBFYz1jLm5sfHxFYzsoZnVuY3Rpb24oYyl7Yy5wbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgRGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLm1hfHx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBFYyhjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRmM9Yy5wbHx8RmMsR2M9bmV3IEZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Iaz10aGlzLmFbNF07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5SbD10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy4kcz1iO2IucHJvdG90eXBlPXtHazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGs6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZzOnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pajp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUmw6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy4kc3x8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPU5kLkdrKDQpOyhmdW5jdGlvbihjKXtjLmZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuZmx8fGJhOyhmdW5jdGlvbihjKXtjLmRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLkxnPTA7dGhpcy5XPXRoaXMuV3x8ITE7CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnZjPXRoaXMueGE9dGhpcy5TYz0hMTt0aGlzLnVoPWUud2IoMTApO3RoaXMuVWcoKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlNhKCksITA7dGhpcy5MZysrO2lmKDEwPHRoaXMuTGcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5VZy5iaW5kKHRoaXMpLDEwMCksITF9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52YTtpZihiKXt2YXIgYT0iYWRFcnJvciIsCmM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApOwp0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmCmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGNhPWMuZGx8fGNhOyhmdW5jdGlvbihjKXtjLmdsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBJYz1jLmdsfHxJYyxKYz0KbmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk9yPXRoaXMuYVsyXTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnpuPWI7Yi5wcm90b3R5cGU9e05yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Pcjp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBLYz1jLnpufHxLYyxPZD1uZXcgS2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1PZC5Ocig0KTsoZnVuY3Rpb24oYyl7Yy5haz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIExjPWMuYWt8fExjOyhmdW5jdGlvbihjKXtjLiRqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLAp0aGlzLnUoKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIE1jPWMuJGp8fE1jOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLk9hKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgTGMoZCksZC5tYXx8dGhpcy5KKGQpfHwodGhpcy5LKGQpLChuZXcgTWMoZCx0aGlzLkcpKS5jKCkpOwplbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5jPWMuYmt8fE5jLE9jPW5ldyBOYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbOV07dGhpcy5Hdz10aGlzLmFbNl07dGhpcy5udT10aGlzLmFbOF07dGhpcy5Gdj10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbNF07dGhpcy5GaT10aGlzLmFbNV07dGhpcy5kaj10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbMl07dGhpcy5YcT10aGlzLmFbNF07dGhpcy5pbD10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLnhyPWI7Yi5wcm90b3R5cGU9e0NsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EbDp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3c6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm51OnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuRnY6dGhpcy5icihhKX0sYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZGo6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpzOnRoaXMuV3EoYSl9LFdxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5YcTp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYz1jLnhyfHxQYyxQZD1uZXcgUGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1QZC5DbCg0KTsoZnVuY3Rpb24oYyl7Yy5oaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5WKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgUWM9Yy5oa3x8UWM7KGZ1bmN0aW9uKGMpe2MuZ2s9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuV2YoKX0sV2Y6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldmKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgUmM9Yy5na3x8UmM7KGZ1bmN0aW9uKGMpe2MuaWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFFjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSihiKSl7dGhpcy5LKGIpOyhuZXcgUmMoYix0aGlzLkcpKS5jKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBTYz1jLmlrfHxTYyxUYz1uZXcgU2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnE9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLnVpPQp0aGlzLmFbNF07dGhpcy53cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs1XX1jLiRrPWI7Yi5wcm90b3R5cGU9e01xOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnE6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLiRrfHxVYyxRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5NcSg0KTsoZnVuY3Rpb24oYyl7Yy5taT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTsKYj8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLmZhKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIFZjPWMubWl8fFZjOyhmdW5jdGlvbihjKXtjLmxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuY2UoKTt0aGlzLlNmKCl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMDt0aGlzLnMoImVtcHR5IHZhc3QiKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlNmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5jZS5iaW5kKHRoaXMpLDEwMCl9LGNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKInBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2EuYmluZCh0aGlzKSwxMCksdGhpcy5zKCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy51KCk6dGhpcy51KCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNlLmJpbmQodGhpcyksMTAwKX19LHU6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5LYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMubGl8fFdjOyhmdW5jdGlvbihjKXtjLm5pPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuSSgpfX0pfSkoYyk7dmFyIFhjPWMubml8fFhjLFljPW5ldyBYYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obz10aGlzLmFbNF07dGhpcy5vbT10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbOV07dGhpcy5lbT10aGlzLmFbNV07dGhpcy5FbT10aGlzLmFbOF07dGhpcy5Ebj10aGlzLmFbM107dGhpcy4kcD10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkltPWI7Yi5wcm90b3R5cGU9e2ZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaG86dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5vbTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnE6dGhpcy5kbShhKX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVtOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FbTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG46dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgWmM9Yy5JbXx8WmMsUmQ9bmV3IFpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UmQuZm8oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuV2c9dGhpcy5ZZz10aGlzLlhnPSExO3RoaXMudWQ9W107dGhpcy5XZT0Ke0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdmM/bnVsbDp2YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBCYz9udWxsOkJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeWM/bnVsbDp5YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgT2M/bnVsbDpPYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHFjP251bGw6cWMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJiP251bGw6cmIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhPwpudWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT9udWxsOll9fWMud209YjtiLnByb3RvdHlwZT17YzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5vcyhhKTpbXSxiO3RoaXMuWWc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuemgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLldnKWJyZWFrO2I9dGhpcy5XZVtjXTt0aGlzLm9mKGIpJiYodGhpcy51ZC5wdXNoKGIpLHRoaXMuemgoYikpfX0sb2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxvczpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPQowO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5vZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLm9mKGEpJiZhLmMoKX0sZnc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJiF0aGlzLlhnKWZvcih0aGlzLldnPSEwLGE9MDthPHRoaXMudWQubGVuZ3RoO2ErKyl0aGlzLnVkW2FdLkFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWRbYV0uQWIpfX19KShjKTt2YXIgJGM9Yy53bXx8JGMsSz1uZXcgJGM7Sy5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2k9dGhpcy5hWzldO3RoaXMuJGw9dGhpcy5hWzEwXTt0aGlzLk1rPXRoaXMuYVsxMF07dGhpcy5UeD10aGlzLmFbMl07dGhpcy5idD10aGlzLmFbOV07dGhpcy5xeD10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsxXX1jLlFtPWI7Yi5wcm90b3R5cGU9CntOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Nazp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMucHgoYSl9LHB4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGFkPWMuUW18fGFkLFNkPW5ldyBhZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLk5pKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnFjKGsuZngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnFjKGsuanUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIFRkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry53YygpO0cuUWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLndjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5RZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cud2MoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLnFnKHdpbmRvdyxHLmd0KCkse2lkOlVkfSl9LDUwMCksbGE9ZS5nYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbNl07dGhpcy5hdT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMucHU9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMubD0KdGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17dGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVrOnRoaXMuJHQoYSl9LCR0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5hdTp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm46dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnB1OnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55czp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLmR1fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucmg9CnRoaXMuY29uZj10aGlzLmViPXRoaXMucGxheWVyPW51bGw7dGhpcy5wZD0wO3RoaXMuVmE9IiI7dGhpcy52ZD1bXTt0aGlzLndkPTA7dGhpcy50aD0hMTt0aGlzLlVlPVtdO2UuZ2IoIm5ld0FkZGVsaXZlcnkiKX1jLnJpPWI7Yi5wcm90b3R5cGU9e052OmZ1bmN0aW9uKGEpe3RoaXMucmg9YX0sQmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlZhPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxJdjpmdW5jdGlvbihhKXt0aGlzLmViPWF9LEh2OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVmFdJiZ0aGlzLmNvbmZbdGhpcy5WYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlZhXVthXSk7cmV0dXJuIGJ9LEJjOmZ1bmN0aW9uKGEsYil7ZS51Yigid2VsdC5kZSIpJiZlLlVhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmh0KCkpdGhpcy5lYi5mKHRoaXMuZWIua2QsdGhpcy5lYi5DYSx0aGlzLmViLlZlLGZ1bmN0aW9uKCl7dGhpcy5CYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIubmMpO2Vsc2UgaWYodGhpcy5HcygpKXRoaXMuR3YoZnVuY3Rpb24oKXt0aGlzLkJjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLncoay4kYyx0aGlzLnBsYXllci52KCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBPKHRoaXMuZ2V0UGxheWVyKCksaCk7YiYmbC5odygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLmdiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBQKGwsdGhpcy5lYixoKTtsLkJoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5idShhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxodDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnBkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMucGQuZ2V0VGltZSgpLHRoaXMucGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnBkPWE7cmV0dXJuITF9LFp2OmZ1bmN0aW9uKCl7ZS5nYigicHJlcm9sbCIpOwplLiRlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGcoYSkpP3RoaXMuQmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX0sWXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuJGUoInBvc3Ryb2xsIik7ZS5nYigicG9zdHJvbGwiKTt0aGlzLk52KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmxnKGMpKT90aGlzLkJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX19LGxnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx4djpmdW5jdGlvbigpe3RoaXMucGxheWVyLlN2KHRoaXMuWXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sRWQ6ZnVuY3Rpb24oYSl7ZS5nYigibWlkcm9sbCIpO2UuJGUoIm1pZHJvbGwiKTtpZighdGhpcy5kaCl7dGhpcy5kaD0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5CYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS53KGsuYWQsdGhpcy5wbGF5ZXIudigpKSl9fSx3djpmdW5jdGlvbigpe3RoaXMucGxheWVyLk12KHRoaXMuRWQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSmUoKX0sYzpmdW5jdGlvbigpe3RoaXMuWnYoKTt0aGlzLnBsYXllci5KZSYmdGhpcy53digpO3RoaXMueHYoKX0seXY6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy52ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3goYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLndkPXRoaXMudmQubGVuZ3RofSxHczpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMud2QmJihhPSEwKTtyZXR1cm4gYX0sR3Y6ZnVuY3Rpb24oYSl7dGhpcy50aD1hO2ZvcihhPTA7YTx0aGlzLnZkLmxlbmd0aDthKyspdGhpcy52ZFthXVsiZnVuY3Rpb24iXSh0aGlzLmN2LmJpbmQodGhpcykpfSxjdjpmdW5jdGlvbihhKXt0aGlzLndkLS07YSYmdGhpcy5VZS5wdXNoKGEpOzA+PXRoaXMud2QmJnRoaXMudGgoKX0sYnU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVWUubGVuZ3RoO2MrKyliPXRoaXMuVWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMucml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzFdO3RoaXMuZXI9dGhpcy5hWzNdO3RoaXMuc2s9dGhpcy5hWzldOwp0aGlzLkdyPXRoaXMuYVszXTt0aGlzLk9wPXRoaXMuYVs3XTt0aGlzLlFxPXRoaXMuYVsyXTt0aGlzLlFrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuY209YjtiLnByb3RvdHlwZT17R286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhvOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2k6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJuOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5lcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2s6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdyOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcDp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXE6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5Razp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNkPWMuY218fGNkLFdkPW5ldyBjZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVdkLkdvKDQpfSkuY2FsbChPb3RhZWxvb3llZWJhWmVlLE9vdGFlbG9veWVlYmFaZWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.108.213 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:16 GMT
Last-Modified
Wed, 15 May 2019 14:59:20 GMT
Server
AmazonS3
x-amz-request-id
15C8CBAD14E499D4
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
JTBvdb+HxEQsQxglrSbg1KSIpe1VksQl4h5oeNjuyTy66fv9YyUTXr8j2SOjCa3LUqjVlT7RqYk=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=2775295902
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9vdGFlbG9veWVlYmFaZWU9T290YWVsb295ZWViYVplZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5VYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuQmgobSksYS5GZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5ZcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay4kYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5CZChjKTthLkl2KGwpO2EuSHYobSk7YS55digpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpsPXRoaXMuYVs4XTt0aGlzLmJ4PQp0aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbOV07dGhpcy52bz10aGlzLmFbNl07dGhpcy50bD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLkF1PWI7Yi5wcm90b3R5cGU9e0lsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KbDp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYng6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhwOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkF1fHxrYSxkZD1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1kZC5JbCg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWXA9ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuRGM9W107dGhpcy4kZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJ2LmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5LZz17fX1jLkFrPWI7Yi5wcm90b3R5cGU9e2d3OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rIl8iKTtyZXR1cm4gYX0sZ2I6ZnVuY3Rpb24oYSl7dGhpcy5mYlthXXx8KHRoaXMuZmJbYV09MCk7dGhpcy5mYlthXSs9MTs1PHRoaXMuZmJbYV0mJiF0aGlzLktnW2FdJiYodGhpcy5LZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmd3KCksITApKX0sJGY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sCnNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxidjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5hdihhLmRhdGEpfSxhdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuY2EuZXZlbnRsaXN0ZW5lci5sZW5ndGgsCmQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sWWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sZGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuJGcoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHwKYls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuUnIoYSkpcmV0dXJuOyhiPXRoaXMuZGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxScjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxvZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxPYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHlnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxIaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKVGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx4ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OwowPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0seWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktCmEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoYSl9LmJpbmQodGhpcyksMTAwKX0sd2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxJPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrOwpjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUk7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMTg1OTc3NTM5MyYKNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0k9SStsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihJKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LHBiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJgoxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxtdDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGllOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLAplPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iub2I/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChuKXt9YS5pc1BoYW50b21KUz0KYjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LGFzOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5pZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFFhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGtqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApSczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxYbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5WaSgpfHxhLmtqKCl8fGEuUnMoKXx8YS5tbSgpfHxhLlhuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGhkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxLcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxkdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx0ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVGgoYikrIjoiK3RoaXMuVGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFRoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSwkZTpmdW5jdGlvbihhKXt0aGlzLlBhPWF9LHFnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUGE7dGhpcy5PZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHFjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5xZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZWQpe3ZhciByPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYocj1rLlRhKGEsYikpO2YmJihyPWsuVGEocixmKSk7YyYmKHI9ay5UYShyLGMpKTtoJiYocj1rLlRhKHIsaCkpO2VkJiYocj1rLlRhKHIsaCkpO2UucWMocil9LGR2OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSYmMTAyMyE9YS5jb2RlJiYxMDE4IT1hLmNvZGUpe3RyeXtpZihsYSYmKGIuc2Vzc2lvbl9pZD1sYSksYi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iLGEuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKSxiLmV2ZW50PWEuY29kZSxiLnNpdGVfaHJlZj0KdGhpcy5xcygpLGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH19Y2F0Y2goZCl7fXJldHVybiBifX0sT2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kdihhKTtpZihiKWlmKCFsfHwhbC5iYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwueGQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wud2EoYSwhMCk7YT1sLndhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIjthLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wuSGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5FY3x8KHRoaXMuRWM9e30pO3RoaXMuRWNbZl18fCh0aGlzLkVjW2ZdPTApO3RoaXMuRWNbZl0rKzsxMDx0aGlzLkVjW2ZdfHwoZj1sLnhkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLndhKGYsITApLGY9bC53YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIisKZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxHZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwua3EoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxvZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoPwp0aGlzLmJiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxxZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5qZChhKToiIn0samQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGFxOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuQWUoYSl8fHRoaXMucHQoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5ZZSYmd2luZG93LnNhbmRib3guWWVbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7CmlmKHRoaXMub2coYSkpcmV0dXJuIHRoaXMub2coYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnBiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuVWEoYSxiLkdhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLm5kKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLlJvKGMsYSk7cmV0dXJuIGN9LFVhOmZ1bmN0aW9uKGEsYiwKZCxmLGMsaCxlLHIpe3ZhciBrPWh8fGw7aD0hMDtyJiYoaD0hMSk7aWYoayYmay5iYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2sud2EoYSxoKTtoPWsud2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBrLkhhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYShhLGIsZCxmLGMsayxlLHIpfS5iaW5kKHRoaXMpLDUwMCl9LCRnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciByPSEwO2UmJihyPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHIpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxXdDpmdW5jdGlvbihhLGIsZCl7dGhpcy4kZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5EYylmb3IodmFyIGMgaW4gdGhpcy5EYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxhaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlVhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuV3QoZi5uZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRjPWF9LFd4OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5VYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxNcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sa3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuQWt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93Lm1nPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fAp7fX1jLnprPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuVHU9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuaXU9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSng9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Bcj17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5OZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuSW89e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5peD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnlxPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5hZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLiRjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5MZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuTG89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5PYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVmQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuWGQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLktvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi4kaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLmx1PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IucmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5iZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSXg9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZng9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5qdT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMuemt8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnJvPXRoaXMuYVsyXTt0aGlzLlVxPXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxXTt0aGlzLkFwPXRoaXMuYVs3XTt0aGlzLiRtPXRoaXMuYVs1XTt0aGlzLnN1PXRoaXMuYVs2XTt0aGlzLktqPXRoaXMuYVsyXTt0aGlzLiR1PXRoaXMuYVsxMF07dGhpcy5icD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs3XX1jLnNxPWI7Yi5wcm90b3R5cGU9e3FvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybzp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MdDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXA6dGhpcy5abShhKX0sWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLiRtOnRoaXMucnUoYSl9LHJ1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zdTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktqOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kdTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYT1jLnNxfHxtYSxmZD1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1mZC5xbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkJrPWI7Yi5wcm90b3R5cGU9e3JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxxYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4Iil9LGtzOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGZkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5mZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5mZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LHdjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmUodGhpcy5xYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmZkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxndDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndjKCkrIjIifSxRZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlKHRoaXMua3MoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5mZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMuQmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXE9dGhpcy5hWzRdO3RoaXMucG49dGhpcy5hWzddO3RoaXMuVWo9dGhpcy5hWzZdO3RoaXMua2k9dGhpcy5hWzddO3RoaXMuRnA9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5ndj1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXE6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBuOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmppKGEpfSxqaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2k6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5ndnx8bmEsZ2Q9Cm5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWdkLmNxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/CmYuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51Zj1ifSkoYyk7dmFyIEo9Yy51Znx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVszXX1jLk9xPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIG9hPWMuT3F8fG9hLGhkPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWhkLllqKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Mudm09CkouZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5HPW51bGw7dGhpcy5BYz0xMDA7dGhpcy54Yj0wO3RoaXMuSWE9MTUwO3RoaXMuQWI9MDt0aGlzLkp2KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy54Yjw9dGhpcy5JYT8odGhpcy54YisrLHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpOjA+dGhpcy5JYSYmKHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpfSxBdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhiPnRoaXMuSWE/ITA6ITF9LHpkOmZ1bmN0aW9uKCl7dGhpcy54Yj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sSnY6ZnVuY3Rpb24oYil7dGhpcy5HPWJ9LGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sSzpmdW5jdGlvbihiKXt0aGlzLkphW2IucWIoKV09YjtLJiZLLllnJiZLLmZ3KGIpfSxBeTpmdW5jdGlvbigpe3JldHVybiBlLk9hKHRoaXMuSmEpfSwKSjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9LGx0OmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTnk6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy52bXx8dDsoZnVuY3Rpb24oYyl7Yy54bT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkFjPTEwO3RoaXMueGI9MDt0aGlzLklhPTUwO3RoaXMuTj1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnNiPSIiO3RoaXMuaGc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApnPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt9LFN2OmZ1bmN0aW9uKGIpe3RoaXMuTj1ifSxCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk59LE12OmZ1bmN0aW9uKGIpe3RoaXMuS2U9Yn0senk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sSmU6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLnhiPD10aGlzLklhJiYodGhpcy54YisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuQWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LHhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEFkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sUHk6ZnVuY3Rpb24oKXt9LFY6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSHMoKXx8dGhpcy5PbygpO3RoaXMuQWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKQ3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sT286ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZ2EoMTApKX0sSHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFM6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxIeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxmYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxEZTpmdW5jdGlvbigpe3JldHVybiExfSxDaDpmdW5jdGlvbihiKXt0aGlzLnNiPWJ9LHl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2J9LHhoOmZ1bmN0aW9uKCl7dGhpcy5zYj1udWxsfSxFeTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuc2ImJihiPSEwKTtyZXR1cm4gYn0sSnk6ZnVuY3Rpb24oKXt0aGlzLmhnfHwodGhpcy5oZz0hMCl9LHNjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHZ5OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIG49Yy54bXx8bjsoZnVuY3Rpb24oYyl7Yy5zaT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLkRmPSIxIjt0aGlzLkVmPSIyIjt0aGlzLnlvPSIzIjt0aGlzLkljPTA7dGhpcy5laD0zMDt0aGlzLkZiPVtdO3RoaXMuWmE9W107dGhpcy5iYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5QZj10aGlzLldoPSExO3RoaXMuc3RhdHVzPXRoaXMuSWM7dGhpcy5pZD1lLmdhKDEwKTt0aGlzLkJkKGIpO3RoaXMuS3YoYSl9LGM6ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7dGhpcy5XaHx8KHRoaXMuV2g9ITAsZS5HZSgpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtTJiZTLk1iJiYhcGEmJihwYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sRjpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLlB2KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5QaCgpLHRoaXMuUGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLkZiLnB1c2goYiksdGhpcy5aYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkZiJiYwPHRoaXMuRmIubGVuZ3RoJiYodGhpcy5GYj1lLnVuaXF1ZSh0aGlzLkZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5GYi5qb2luKCIsIikpKTtpZih0aGlzLlphKXtmb3IodmFyIGc9MDtnPHRoaXMuWmEubGVuZ3RoO2crKyl0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXT09dGhpcy5iY1tiXSYmYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSx0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXTwKdGhpcy5iY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSxiPXRoaXMuWmFbZ10ucmVhc29uKTt0aGlzLmJjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LFB2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZn0sUXY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnlvfSxLYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSWN9LEdmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxteTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5FZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuSWN9LEJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPQpifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEt2OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxoczpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LFp0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5zaXx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbD10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbNV07dGhpcy5Uaz10aGlzLmFbMl07dGhpcy5Ebz10aGlzLmFbNF07dGhpcy5QdD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs2XX1jLlhpPWI7Yi5wcm90b3R5cGU9e1VsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WbDp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQmo6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRrOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuRG86dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlB0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5YaXx8cWEsaWQ9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuVWwoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSwKaWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTiYmdGhpcy5OKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5Eanx8VDsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuT2Q9bnVsbDt0aGlzLnJ4PTFFMzt0aGlzLm5oPW51bGw7dGhpcy5Kdz0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub2IpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Kci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuRHMuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5DcyhhLApiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV4KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52eChiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkJzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy53cShhKX0uYmluZCh0aGlzKSl9LHdxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sdXg6ZnVuY3Rpb24oYil7dGhpcy5PZHx8KHRoaXMuT2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd4KGIpfS5iaW5kKHRoaXMpLHRoaXMucngpKX0sd3g6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2QpO3RoaXMuRigpfSx2eDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZCl9LApCczpmdW5jdGlvbihiKXt0aGlzLnN5KGIpO3RoaXMubmg9bmV3IERhdGU7dGhpcy5uaC10aGlzLld1PHRoaXMuSnc/dGhpcy5GKCk6dGhpcy5zKCl9LERzOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuQmQobmV3IFQoYSkpKTt0aGlzLkYoKX0sSnI6ZnVuY3Rpb24oKXt9LENzOmZ1bmN0aW9uKCl7dGhpcy5XdT1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk9hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZywKdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRWp8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rdj10aGlzLmFbNV07dGhpcy5Qcz10aGlzLmFbM107dGhpcy51dT10aGlzLmFbNl07dGhpcy4keD10aGlzLmFbN107dGhpcy5Paz10aGlzLmFbMTBdO3RoaXMucm49dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMl19Yy5Haj1iO2IucHJvdG90eXBlPXtqdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Y6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51dTp0aGlzLlp4KGEpfSxaeDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHg6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9rOgp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1YT1jLkdqfHx1YSxqZD1uZXcgdWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1qZC5qdig0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3RoaXMubmcoKTt0aGlzLnBnKCk7dGhpcy54cT0hMX0sbmc6ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5OYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxwZzpmdW5jdGlvbigpe2lmKCF0aGlzLk5iKXt2YXIgYj0KdGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuTmI9ITApO3RoaXMuVihhKX19LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTiYmKDAsdGhpcy5OKSgpfS5iaW5kKHRoaXMpKX0sSmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5FZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcykpfSxFZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLktlJiYoMCx0aGlzLktlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTsKcmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgdmE9Yy5Za3x8dmE7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTTpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkljO3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMX0sYzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/CmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuV2Q9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmxiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5sYj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5sYj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMubGI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTsKdGhpcy5LYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuZWgmJiF0aGlzLmhhKCkmJih0aGlzLmxiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMuaGEoKSYmKHRoaXMuS2EoKSx0aGlzLmdldFBsYXllcigpLnhxPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5zYjthJiYoYS50ZCgpLGEuZ2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuS2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5laCYmIXRoaXMuaGEoKSYmKHRoaXMubGI/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLk1jLmluZGV4T2YoYSkmJnRoaXMuTWMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5lYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm8oImFkZXJyb3IiLGIuY29kZSksdGhpcy5NYy5sZW5ndGg+PXRoaXMuV2QmJnRoaXMudSgpKX0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5pKCJKVzogIitiLnR5cGUpfSx1OmZ1bmN0aW9uKGIpe2I/dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xOnRoaXMua2U/dGhpcy5rZSsrOnRoaXMua2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSGgoYS52aWRlb1RhZyk/YS5OYj90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLktjfHx0aGlzLmlzUGxheWluZz8odGhpcy5rZT50aGlzLmxlJiYoYj0hMSksdGhpcy5GKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEubmcoKSxhLnBnKCksYS5OYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgd2E9Yy5Ya3x8d2E7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5kcygpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IHZhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5KKGcpfHx0aGlzLmx0KGcpfHwodGhpcy5LKGcpLGc9bmV3IHdhKGcsdGhpcy5HKSxnLk0oKSxnLmMoKSl9fXRoaXMuSSgpfX0seHk6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sZHM6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnBiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB4YT1jLlprfHx4YSx5YT1uZXcgeGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBqPXRoaXMuYVs2XTt0aGlzLkN3PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuSWs9YjtiLnByb3RvdHlwZT17b2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBqOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMuSWt8fHphLGtkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWtkLm9qKDQpOyhmdW5jdGlvbihjKXtjLlpuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTsKdmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLlpufHxBYTsoZnVuY3Rpb24oYyl7Yy5Zbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHwKYi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5Zbnx8QmE7KGZ1bmN0aW9uKGMpe2MuJG49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5PYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPQpiW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IEFhKGcpLHRoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuJG58fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ibj10aGlzLmFbNF07dGhpcy5LdT10aGlzLmFbMV07dGhpcy5Udz10aGlzLmFbOV07dGhpcy54dT10aGlzLmFbNV07dGhpcy5KdD10aGlzLmFbMV07dGhpcy5IdD10aGlzLmFbMl07dGhpcy5CbD10aGlzLmFbOF07dGhpcy5rcD10aGlzLmFbNF07dGhpcy5iaj10aGlzLmFbNF07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVszXX1jLlFzPWI7Yi5wcm90b3R5cGU9e0duOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ibjp0aGlzLkp1KGEpfSwKSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkt1OnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Udzp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh1OnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KdDp0aGlzLkd0KGEpfSxHdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHQ6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJsOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5haihhKX0sYWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJqOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuUXN8fEVhLGxkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5Hbig0KTsoZnVuY3Rpb24oYyl7Yy5Nbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5pYihiKX0uYmluZCh0aGlzKSl9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuTW58fEZhOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucWE9dGhpcy52Yz10aGlzLnhhPXRoaXMuU2M9ITE7dGhpcy51aD1lLndiKDEwKTt0aGlzLlZoPSEwO3RoaXMuZ2M9dGhpcy5OZz0hMTt0aGlzLmloKCk7dGhpcy5ocSgpO3RoaXMuU2EoKX0sS3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLnFiKCksCiI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRGE/Yi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5EYT90eXBlb2YgYi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuRGE/Yi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi5EYT90eXBlb2YgYi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlRkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuVGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuVWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS52YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi52YToidW5kZWZpbmVkWCIsIjsiLGIuUj8KdHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuWmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5yYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudmF9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmMpe3ZhciBiPXRoaXMucmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy52Yz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMudmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy52Y30sanQ6ZnVuY3Rpb24oKXtpZighdGhpcy5NZyl7dmFyIGI9CnRoaXMucmIoKSxhPXRoaXMuaXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk1nPSEwKX1yZXR1cm4gdGhpcy5NZ30saXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5TYz0hMCk7cmV0dXJuIHRoaXMuU2N9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxYZTpmdW5jdGlvbigpe3RoaXMuZ2M9ITA7dmFyIGI9dGhpcy5CZygpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlFhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5oYz0hMDtpZihlLnViKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSx3eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2cmJmIuYWRzJiYodGhpcy5jZz1iLmFkcyk7cmV0dXJuIHRoaXMuY2d9LGhxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLkthKCk7dGhpcy5hYSghMCk7dGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7CnRoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQmcoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksNTApfSxpaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5qdCgpKXt2YXIgYT0KdGhpcy5yYigpLGc9dGhpcy5KYigpO2EmJmcmJih0aGlzLnJiKCksdGhpcy5KYigpLHRoaXMuZ2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nYz90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMucmIoKX1lbHNlIHRoaXMuTmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJiKCksYj10aGlzLkpiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5hYSgpKToodGhpcy5hYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuTmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5paCgpfS5iaW5kKHRoaXMpLDUwKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0saXE6ZnVuY3Rpb24oKXt0aGlzLm1jfHwodGhpcy5tYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMubWMhPWIuYWRzLnN0YXRlJiYodGhpcy5tYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5tYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLm1jPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pcSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXswPD1lLmhkKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlc/dGhpcy51KCEwKToodGhpcy5xYT0hMCx0aGlzLnMoImVtcHR5IHZhc3QiKSl9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwodGhpcy5WaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkYodGhpcy5WaCxmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbnE6ZnVuY3Rpb24oKXt0aGlzLkZ5fHwoMTA8dGhpcy5zeD8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN4KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuenYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnEoKX0uYmluZCh0aGlzKSw1MCkpKX0senY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLnR4KXt0aGlzLnR4PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIEdhPWMuTG58fEdhOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkloKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5JaChiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxJaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS5PYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm1hfHx0aGlzLkooYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuSyhhKSwobmV3IEdhKGEsdGhpcy5HKSkuYygpKSk7cmV0dXJuITB9cmV0dXJuITF9LEk6ZnVuY3Rpb24oKXt0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMuQWMpfX0pfSkoYyk7dmFyIEhhPWMuTm58fEhhLElhPW5ldyBIYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ucj10aGlzLmFbOV07dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VcD10aGlzLmFbNV07dGhpcy5vcD10aGlzLmFbN107dGhpcy5IbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5tcD10aGlzLmFbM107dGhpcy5xcD10aGlzLmFbMV07dGhpcy5Gbz0KdGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNl19Yy5PeD1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubnI6dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KcDp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXA6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vcDp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGw6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldvOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXA6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFwOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7CnZhciBKYT1jLk94fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5tcig0KTsoZnVuY3Rpb24oYyl7Yy5sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7Yi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlMoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0sbGE6ZnVuY3Rpb24oKXt9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLk4mJgoidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLAphPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5sbnx8S2E7KGZ1bmN0aW9uKGMpe2Mua249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuS2I9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWmI9ITE7dGhpcy53aCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT1iLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlpiPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTsKYi5nZXRQbGF5ZXIoKTt0aGlzLlhjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuWWYoKTp0aGlzLnMoKX0sWGM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7YS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuWmI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7CmEuZ2V0UGxheWVyKCk7dGhpcy5aYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMucygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhjLmJpbmQodGhpcyksMTAwKX19LFlmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmCih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LYiksdGhpcy5zKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5LYiYmKHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHwodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkYoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5ZZi5iaW5kKHRoaXMpLDUwKX19LHdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiYKYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlpiPSEwLHRoaXMucygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53aCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmtufHxMYTsoZnVuY3Rpb24oYyl7Yy5tbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmCnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5tbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR5PXRoaXMuYVs0XTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLk1pPXRoaXMuYVs2XTt0aGlzLlNwPXRoaXMuYVsyXTt0aGlzLlNqPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzddfWMuc3I9YjtiLnByb3RvdHlwZT17Y3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5keTp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGk6dGhpcy5MaShhKX0sTGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5NaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3A6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5zcnx8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuY3koNCk7KGZ1bmN0aW9uKGMpe2MuaG49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZWxfO2F8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5lbD9hPWIuZWwoKToiZnVuY3Rpb24iPT10eXBlb2YgYi5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCgpKSkpO3RoaXMuUyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCihiPWJbMF0pO3RoaXMuVihiKX0saWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YSYmYi5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZTIifSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLm11dGVkJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5tdXRlZCYmKGI9YS5tdXRlZCgpKTtyZXR1cm4gYn0sc2M6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5obnx8UGE7KGZ1bmN0aW9uKGMpe2MuZ249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5YZigpO2Iub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5Kb3x8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygidGltZXVwZGF0ZSIpO3RoaXMuRighMCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX0ZJUlNUX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLm8oImFkc2Vycm9yIik7dGhpcy5BcyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LEFzOmZ1bmN0aW9uKGIpe3ZhciBhPTk5OTk5OTtpZihiLmRhdGEmJmIuZGF0YS5BZEVycm9yKWZvcih2YXIgZyBpbiBiLmRhdGEuQWRFcnJvciliLmRhdGEuQWRFcnJvci5oYXNPd25Qcm9wZXJ0eShnKSYmIm51bWJlciI9PXR5cGVvZiBiLmRhdGEuQWRFcnJvcltnXSYmKGE9Yi5kYXRhLkFkRXJyb3JbZ10sdGhpcy5vKGEpKTs5MDE9PWE/dGhpcy5zKCk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PQphPyh0aGlzLlpiPSEwLHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMuSm89ITAsdGhpcy5zKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5YZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz90aGlzLkYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBRYT1jLmdufHxRYTsoZnVuY3Rpb24oYyl7Yy5qbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UmJiJmdW5jdGlvbiI9PQp0eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy56ZCgpLHRoaXMuSSgpfX0pfSkoYyk7dmFyIFJhPWMuam58fFJhLFNhPW5ldyBSYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kaz10aGlzLmFbMV07dGhpcy5FdD10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsxXX1jLkh3PWI7Yi5wcm90b3R5cGU9e2NrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZGs6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgVGE9Yy5Id3x8VGEsb2Q9bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9b2QuY2soNCk7KGZ1bmN0aW9uKGMpe2MuWmk9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5oaD1hfSxNOmZ1bmN0aW9uKCl7fSxIZTpmdW5jdGlvbihiKXt0aGlzLmhoPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmhoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTt0aGlzLlYoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKUDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgVWE9Yy5aaXx8VWE7KGZ1bmN0aW9uKGMpe2MuWWk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxIZTpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZhPWMuWWl8fFZhOyhmdW5jdGlvbihjKXtjLiRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFVhKGQsYSksdGhpcy5KKGQpfHwoZC5IZShhKSx0aGlzLksoZCksCmQ9bmV3IFZhKGQsdGhpcy5HLGcpLGQuSGUoZyksZC5jKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgV2E9Yy4kaXx8V2EsWGE9bmV3IFdhKGlhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbMTBdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMuSm49dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzldO3RoaXMueGk9dGhpcy5hWzldO3RoaXMuT3U9dGhpcy5hWzZdO3RoaXMuRmw9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy50cT1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXA6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5vOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53czp0aGlzLkluKGEpfSwKSW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpuOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vazp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhpOnRoaXMuTnUoYSl9LE51OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PdTp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYT1jLnRxfHxZYSxwZD1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1wZC5QcCg0KTsoZnVuY3Rpb24oYyl7Yy55bD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07CnRoaXMuUyhiKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxRYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBaYT1jLnlsfHxaYTsoZnVuY3Rpb24oYyl7Yy54bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5RYSgpPwooJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5MYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSkpOnRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyICRhPWMueGx8fCRhOyhmdW5jdGlvbihjKXtjLnpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFphKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgJGEoYix0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFiPWMuemx8fGFiLGJiPW5ldyBhYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy50bz10aGlzLmFbM107dGhpcy5Edj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy5ycT1iO2IucHJvdG90eXBlPXtobTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW06dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRvOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Edjp0aGlzLmooYSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLnJxfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5obSg0KTsoZnVuY3Rpb24oYyl7Yy5xbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLlBlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5mYSgpO3JldHVybn10aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlYoYik6dGhpcy5mYSgpfSxYdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnNiLGc9dGhpcy5xYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5NYiYmKDA8PWcuaW5kZXhPZihkKXx8YS50ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUGU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxSYTpmdW5jdGlvbigpe3RoaXMuUGUrKztpZigxMDx0aGlzLlBlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGxhOmZ1bmN0aW9uKCl7fSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLk4mJnRoaXMuTigpfX0pfSkoYyk7dmFyIGRiPWMucW18fGRiOyhmdW5jdGlvbihjKXtjLnBtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHhhOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8Cih0aGlzLnRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMudGIrKywxNTx0aGlzLnRiKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMubmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy55YSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLnhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkhyPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLkhyPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWHUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMucG18fGViOyhmdW5jdGlvbihjKXtjLnJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5ybXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFxPXRoaXMuYVsxXTt0aGlzLmw9dGhpcy5hWzVdfWMubGo9YjtiLnByb3RvdHlwZT17cHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFxOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5sanx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQucHEoNCk7KGZ1bmN0aW9uKGMpe2Mud2s9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5WKGIuZWxlbWVudCl9LFJiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMud2t8fGliOyhmdW5jdGlvbihjKXtjLnZrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PQpiLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCl9fSl9KShjKTt2YXIgamI9Yy52a3x8amI7KGZ1bmN0aW9uKGMpe2MueGs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMueGt8fGtiLGxiPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbz10aGlzLmFbNF07dGhpcy5Gbj10aGlzLmFbNF07dGhpcy5Laz10aGlzLmFbM107dGhpcy56aT10aGlzLmFbMV07CnRoaXMuTnQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMTBdfWMuV2k9YjtiLnByb3RvdHlwZT17Wm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Gbjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5OdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIG1iPWMuV2l8fG1iLHNkPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXNkLlpvKDQpOyhmdW5jdGlvbihjKXtjLlZrPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTt0aGlzLnBoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuUyhnKTt0aGlzLlYoZyk7dGhpcy5kZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kZCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1xOmZ1bmN0aW9uKCl7ZS5UZyh0aGlzLmRkKTtlLnhlKHRoaXMuZGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tcSgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxEZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIG5iPWMuVmt8fG5iOyhmdW5jdGlvbihjKXtjLlVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCEwKX19KX0pKGMpO3ZhciBwYj1jLlVrfHxwYjsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTsKZS5UZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IHBiKGIsdGhpcy5HKSkuYygpKSk7dGhpcy5BYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5BYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcWI9Yy5Xa3x8cWIscmI9bmV3IHFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs5XTt0aGlzLm1sPXRoaXMuYVs3XTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLlRzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuRm09YjtiLnByb3RvdHlwZT17Y3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMucmo6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tbDp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWHI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgc2I9Yy5GbXx8c2IsdGQ9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuY3QoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkNrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEx2OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSwKYil7dGhpcy5kYXRhW2FdPWJ9LFBvOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuQ2t8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5YYT1hO3RoaXMuc2c9dGhpcy5maT0hMTt0aGlzLmpoPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeChhKSk7dmFyIGU9dGhpcy5EYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC5CZSh0aGlzLlhhLnVybCkmJmwuSmQpe3ZhciBoPW5ldyB4KGEudXJsKTsKaC5MdigiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLm5hKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5uYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuRGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuc2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCwKdGhpcy5YYS51cmwsITEpOnRoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy5maXx8KHRoaXMuRGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLkRiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuRGIuc2VuZChhKX1jYXRjaChjKXtsJiZsLkJlKHRoaXMuWGEudXJsKT9sLkpkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuQmUodGhpcy5YYS51cmwpLHRoaXMuamgmJnRoaXMuamgoKX1yZXR1cm4gdGhpcy5EYn19fSkoYyk7dmFyIHRiPWMuRGt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmpjPSIiO3RoaXMuJGQ9dGhpcy5pYz10aGlzLm5iPW51bGw7dGhpcy5McT10aGlzLnliPXRoaXMuWmc9ITE7dGhpcy5HYT0iIjt0aGlzLlZnPSExO3RoaXMuQ2E9CnRoaXMua2Q9IiI7dGhpcy5SZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLkhnPXRoaXMuVGI9IiI7dGhpcy5qZT0hMTt0aGlzLmhmPTA7dGhpcy55Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5FYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVmI9IiI7dGhpcy56Yj1bXTt0aGlzLldiPVtdO3RoaXMuVWI9IiI7dGhpcy5qZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnVlPSExO3RoaXMub3E9dGhpcy5LZD1udWxsO3RoaXMuRmg9dGhpcy5GYz10aGlzLmpnPXRoaXMubmY9dGhpcy5KZD10aGlzLmFlPXRoaXMuSmM9CiExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMubWQ9MDt0aGlzLkpnPSExO3RoaXMuSWc9MUUzfWMuRWs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuc2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5qYyxhZHRhZ21vZGlmaWVyOnRoaXMubmIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmljLGFkdGFncmVnZXg6dGhpcy4kZCxqc3BvcHVwczp0aGlzLlpnLHNpZGVsb2Fkczp0aGlzLnliLGRpc2FibGV0ZXN0czp0aGlzLkxxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuVmcsZ2xvYmFsQ29uZmlnOnRoaXMua2QsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5SZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5UYixob21hZEFkcGF0aDp0aGlzLkhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuamUsCnRlc3RDb29raWVBdHRlbXB0czp0aGlzLmhmLEhPTUFEX1ZFUklGSUVEOnRoaXMueWYsSE9NQURfQkxPQ0tFRDp0aGlzLndmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkViLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy54Zix0ZXN0SGlkZTp0aGlzLlZiLHRlc3RUYWdzOnRoaXMuemIsdGVzdFRhZ3NKUzp0aGlzLldiLHRlc3RDb29raWU6dGhpcy5VYix0aHJvdHRsZTp0aGlzLmpmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMudWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5vcSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5hZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5KZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5TYixzZXJ2ZXJJZDp0aGlzLkFoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5wYywKdnBhaWQ6dGhpcy5GYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuYWl9fSxGczpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LGVzOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLndiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuTXAoYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5zYSYmIWIpcmV0dXJuIG5ldyB4KGEpO2M9dGhpcy5BZShhKTtlPXRoaXMuemEoYSk7Yz8odGhpcy54YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy54ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmpjfHx0aGlzLm5ifHx0aGlzLmljfHx0aGlzLiRkKSYmKGs9dGhpcy5mdShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdzKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5wYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy54YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxCZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkFlKGEpO3JldHVybiBifSxnczpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5yeTtyZXR1cm4ibm9uZSJ9LG5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy5BaF19LHhkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sZmg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sZXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5maChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pOwpCPVtdO2ZvcihsIGluIGMpQi5wdXNoKGwrIj0iK2NbbF0pO2M9Qj1lbmNvZGVVUklDb21wb25lbnQoQi5qb2luKCImIikpfWVsc2UgYz10aGlzLmZoKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9bD1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWwucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sZnU6ZnVuY3Rpb24oYSl7dGhpcy5qYyYmKGErPXRoaXMuamMpO2lmKHRoaXMubmIpZm9yKHZhciBiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5uYltiXSkpO3RoaXMuaWMmJihhPXRoaXMuZXUoYSx0aGlzLmljKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlZnPSEwO3RoaXMua2Q9YTt0aGlzLkNhPWI7dGhpcy5WZT1kO3RoaXMuS2Q9Yzt0aGlzLm5jPWU7dGhpcy5TYj1ofHx7fTt0aGlzLlZ0KCk7aWYoInN0cmluZyI9PQp0eXBlb2YgdGhpcy5DYSl0aGlzLlR0KCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLlljKCl9Y2F0Y2goayl7dGhpcy5uYSgibm9DbGllbnRDb25maWciKX19LGhiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxWdDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5rZCt0aGlzLlFjKCJnbG9iYWwiKSksdGhpcy56cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLlljKCl9LmJpbmQodGhpcyksITApfSxUdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5RYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLlFjKCJjbGllbnQiKSksdGhpcy5ZYy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuWmUoImNsaWVudCIpO3RoaXMubmEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFFjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLndiKCk7dGhpcy5TYiYmdGhpcy5TYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuU2ImJnRoaXMuU2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5uYz0hMSk7dGhpcy5uYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm5jPwp0aGlzLm5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmJhPXRoaXMuUmc9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMud2YpKTt0aGlzLkJiKCk7ZS5xYyhrLlR1KTsoYj1lLmhkKHRoaXMubmQoKSkpfHwoYj1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx6czpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5UYnx8dGhpcy5HYXx8dGhpcy5ZYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKSwKdGhpcy5CYigpKX19LFljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuQ2F9ZWxzZSBhPXRoaXMuQ2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihhLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlRiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5IZz1hLmFkcGF0aHx8IiI7dGhpcy5qZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkFoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVGImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoPwp0aGlzLnFkKCExKToodGhpcy5zYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5CYigpKX0scWQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB4KHRoaXMueGQoKSksZD10aGlzLnphKHRoaXMuVGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5UYit0aGlzLlFjKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5sdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiY3VzdG9tZXIiKTthP3RoaXMuUG0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5QbT0hMCwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxsdzpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe310aGlzLkpkPXRoaXMuWGIoYi5zdHJpY3QpO3RoaXMubmY9dGhpcy5YYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5qZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucGM9dGhpcy5YYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuWGIoYi5lbmFibGVkKTt0aGlzLlZiPWIudGVzdGhpZGV8fCIiO3RoaXMuemI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLldiPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuamM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1iLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuaWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLiRkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlpnPWIuanNwb3B1cHN8fCExO3RoaXMueWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuRmM9Yi52cGFpZHx8ITE7dGhpcy5TYi52cGFpZD10aGlzLkZjO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5WYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYWk9Yi52bWFwc3x8IiI7dGhpcy5VYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBzKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5qZSYmKHRoaXMuVWI9bnVsbCk7dGhpcy5qZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnVlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy51ZT0hMCx0aGlzLnFkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLkl3KCkmJgoodGhpcy5WYnx8dGhpcy5XYnx8dGhpcy56Ynx8dGhpcy5VYik/dGhpcy5WZT8odGhpcy5zYT10aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5lZSgpLHRoaXMuQmIoKSk6dGhpcy5ydygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN3KCkpfX0scnc6ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy50dygpfSx0dzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLndpZHRoPTE7Yy5oZWlnaHQ9MTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3JjPSJhYm91dDpibGFuayI7dmFyIGg9ZS5nYSgxMCksQj1lLmdhKDEwKSxrPWUuZ2EoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGssZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmEoQikrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UucGIoYShoKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChsKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2lmKDMhPWQpe3ZhciBhPWUuaWUoKTshYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5RYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKTt0aGlzLkJiKCl9LElkOmZ1bmN0aW9uKGEpe3RoaXMuSmM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9CnRoaXMuc2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKGEpKSx0aGlzLkJiKCksdGhpcy5lZSgpKX0scXc6ZnVuY3Rpb24oKXtpZih0aGlzLlZiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlZiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuVmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuTmgoKX1lbHNlIHRoaXMuTmgoKX0sCk1oOmZ1bmN0aW9uKCl7dmFyIGM7dmFyIGQ7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpO3RoaXMud3coYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmVmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5JZCh0aGlzLkhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9dGhpcy56Yj1udWxsLHRoaXMuZWYoKX0sd3c6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpOwp0aGlzLnh3KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5NaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5XYiYmdGhpcy5XYi5sZW5ndGgpe3ZhciBjPXRoaXMuV2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSx4dzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LGVmOmZ1bmN0aW9uKCl7dGhpcy5VYj8odGhpcy5oZisrLHRoaXMuSGEobmV3IHgodGhpcy5VYiksdGhpcy5wdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuSWQodGhpcy54ZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmhmP3RoaXMuZWYoKTp0aGlzLmZmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuS2goKTp0aGlzLmZmKCJBQUEiKX0sS2g6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSk7dGhpcy5CYigpO3RoaXMuZWUoKX0sQmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuUWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5KYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMueWYpKTt0aGlzLktkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuS2QmJnRoaXMuS2QoKX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLm5mJiZ0aGlzLkZzKCkpe3ZhciBhPXRoaXMuZXMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFBoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsYixjLGYsaCxCKXt0aGlzLm1kfHwodGhpcy5tZD0wKTt0aGlzLm1kKys7dGhpcy5tZD50aGlzLklnJiYhdGhpcy5KZyYmKHRoaXMuSmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLklnLCEwKSk7YT1uZXcgdGIoYSxiLGMpO2YmJihhLmZpPSEwKTtoJiZlLm10KCkmJihhLnNnPSEwKTtCJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxWZjpmdW5jdGlvbigpe2UuUWEoKXx8ZS5VYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubmEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMueGMoKXx8KGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTsKaC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxvdzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5haX0sa3E6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5oeC5iaW5kKHRoaXMpLAp0aGlzLmd4LmJpbmQodGhpcykpfSxoeDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuQ3IoKX0sZ3g6ZnVuY3Rpb24oKXt9LENyOmZ1bmN0aW9uKCl7ZS5xYyhrLkJyKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLm5hKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxlZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnliLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMueWIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy55YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBSO3dpbmRvd1tjLndjKCldPXRoaXM7ZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLmpmfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sd2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFhiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLHAsbix2LHUsdztwPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHgucHVzaChlKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PAoyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKHA+Pj4yOSk7eC5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO3A9bDtuPW07dj1xO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl3PWMoZSw1KSsocCZufH5wJnYpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStuJjQyOTQ5NjcyOTU7cT1xK3YmNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciB1Yj1jLkVrfHx1YixsPW5ldyB1Yjt3aW5kb3cudWc9bDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adz10aGlzLmFbNF07dGhpcy5XbT10aGlzLmFbMl07dGhpcy5LaT10aGlzLmFbMV07dGhpcy5jdz10aGlzLmFbMl07dGhpcy5rbD10aGlzLmFbNF07dGhpcy5zdD10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbN107CnRoaXMuVnI9dGhpcy5hWzddO3RoaXMuWW09dGhpcy5hWzNdO3RoaXMuWnE9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMl19Yy53bz1iO2IucHJvdG90eXBlPXtZdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnc6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LaTp0aGlzLmJ3KGEpfSxidzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3c6dGhpcy5qbChhKX0samw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtsOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdDp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Wcjp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlltOnRoaXMuWXEoYSl9LApZcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWnE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB2Yj1jLndvfHx2Yix1ZD1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT11ZC5Zdyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLm0uUD90aGlzLlZhPWEubS5QKCk6dGhpcy5WYT0iIjthLm0uUGcmJmEubS5QZyh7cGF1c2U6dGhpcy50ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLkxlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuJHcuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5hYjt0aGlzLnBsYXllcj10aGlzLmIubTt0aGlzLkhiPXRoaXMuVGM9ITE7dGhpcy5LcD0xRTM7dGhpcy5qYT0KbnVsbDt0aGlzLlQ9Yjt0aGlzLnVhPXt9O3RoaXMudmlkZW89e307dGhpcy5HZD17fTtlLmdiKCJuZXdCaWdBZElkIik7dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmJmPTA7dGhpcy5SYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlJjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlJjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuRmQ9ITE7dGhpcy5iaD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuUGM9ITE7dGhpcy5TaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLk1iPSExO3RoaXMuenE9CmUuZ2EoMTApO3RoaXMuUGI9ZS5nYSgxMCk7dGhpcy5PYj1lLmdhKDEwKTt0aGlzLkdoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm9jPXRoaXMudmI9ITE7dGhpcy5tZT1udWxsO3RoaXMuTmQ9dGhpcy5DYj10aGlzLndlPXRoaXMuU2U9dGhpcy5mZT10aGlzLmJkPXRoaXMuZGY9dGhpcy5hYz10aGlzLlBkPXRoaXMubGg9dGhpcy5lZD10aGlzLkt3PXRoaXMua2I9ITE7dGhpcy5lYz1bXTt0aGlzLlliPXt9O3RoaXMua2Y9ITF9Yy55az1iO2IucHJvdG90eXBlPXtCaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pO3JldHVybiBifSxRaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5QYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULkpjP2UudHJhY2soImFkY2FsbCIsIjEiKToKZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay5Mbyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxGZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5rYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmJmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5ULmxxKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLlFoKCksbmV3IFUodGhpcyxhLHRoaXMuYmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5GYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5RaCgpLG5ldyBVKHRoaXMsYSx0aGlzLmJoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULkZjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLAprZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLk1hKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkZlKGEsYixjKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7dGhpcy5OZD10aGlzLkNiPXRoaXMuZWQ9ITE7dGhpcy5nPWE7dGhpcy5Udih0aGlzLmcpO3RoaXMuRWcoYSk7dGhpcy5lYz10aGlzLnZnKGEpO3RoaXMuWWI9e307dGhpcy5rZj0hMX0sRWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5zcyhhKSksdGhpcy5FZyhhLnBhcmVudCkpfSx2ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMudmcoYS5wYXJlbnQpKSwKYy5wdXNoKHRoaXMuJHIoYSkpKTtyZXR1cm4gY30sJHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHNzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlguZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuY2QmJmEuY2QuZXJyb3ImJmEuY2QuZXJyb3IuY29kZSYmKGI9YS5jZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LkdjLmNvZGU6Yj09RC5SZC5jb2RlP2UudyhrLkp4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpOihlLkdlKCksYj09RC5CZi5jb2RlJiZlLncoay5odSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Bcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuemYuY29kZTplLncoay5peCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQ2YuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5OeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS53KGsuUngsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7CmJyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudyhrLml1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMub2N8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkliKGEpO3RoaXMuTWEoKX0sSWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkxhLmxlbmd0aDspdHJ5e3ZhciBjPWEuTGEucG9wKCk7dGhpcy5FZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sVHY6ZnVuY3Rpb24oYSl7dGhpcy5mZT0KdGhpcy53ZT10aGlzLlNlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7dGhpcy5VbyYmdGhpcy5wbGF5ZXIuc2MoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnNjKCkvCjEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuUW8oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLk9oKGIpPyh0aGlzLlNvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy51cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLlJ2KCkpOnRoaXMuemUoKT90aGlzLkRoKCk6dGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0sUnY6ZnVuY3Rpb24oKXt0aGlzLmFjPXRoaXMuUGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuYWM9ITApO2UuJGYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4udGYmJmUuVG8odGhpcy5nLm9yaWdpbi50Zik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCxhKTt0aGlzLmIubWgoKTt0aGlzLmIuQ2MoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYi5DYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLnBmKCJ2cGFpZCIpO3RoaXMuYWMmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTsKdGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnVzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmFxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5ZZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkxiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmVjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMueHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYKKHRoaXMueXgoKSx0aGlzLmIuTGIoITApLCF0aGlzLkNiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLk5kPSEwO2UudyhrLiRoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnllKHRoaXMuQ2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5MYighMCksdGhpcy5DeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuTGIoITApLAp0aGlzLkd4KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSHgoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuYmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcubGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuYWcsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7CmEuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkJ4KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnp4KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLkF4KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5hYz0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5yZCwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYWM9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5tZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuWWQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSk7ZS5ZZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcykpO3RoaXMuYi5ObyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHp4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLlBkPSEwfSxBeDpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLlBkPSExfSxDeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEJ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHl4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuWWEoImltcHJlc3Npb24iKTtlLncoay5IZiwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sR3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sRXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEZ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLkpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5OZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxEeDpmdW5jdGlvbigpe3RoaXMuTGQoKTtlLllhKCJjb21wbGV0ZSIpfSwKYmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5NYShhKX19LHh4OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudyhrLkl4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7CnRoaXMuYmkoITApfSxRbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnhjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy5veC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sU286ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdGhpcy5NZC5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk1kLmJpbmQodGhpcykpfSxaaDpmdW5jdGlvbihhKXt0aGlzLkhifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGJ8fHRoaXMucWYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxxZjpmdW5jdGlvbihhKXtpZighdGhpcy5UYyYmdGhpcy5PaCh0aGlzLnZpZGVvKSYmIXRoaXMudmImJiF0aGlzLkhiKXt0aGlzLlRjPQohMDt0cnl7aWYoIWUuUWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudmJ8fCh0aGlzLnZiPSEwLHRoaXMueWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmpnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5NYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLm54KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQ2MoKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMuUmYoKTt0aGlzLmIubWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuY2YoKX19LGNmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmQpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJgooYT1hKGUuUGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMubGQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmxkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuTmMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTmMoKX1lbHNlIHRoaXMuTmMoKX0sTmM6ZnVuY3Rpb24oYSl7aWYodGhpcy5sZClmb3IodmFyIGI9MDtiPHRoaXMubGQubGVuZ3RoO2IrKyl0aGlzLmxkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmJkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5NYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkxlKCEwKSx0aGlzLk5jKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLndlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5TZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlFiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuUWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUWIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLlBjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5jZigpKX0uYmluZCh0aGlzKTt0aGlzLnBlKCkuQ2godGhpcyl9LExkOmZ1bmN0aW9uKCl7dGhpcy5ULnBjJiYhdGhpcy52YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLklvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5NYSgpfSxNYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSlpZih0aGlzLmZlPSEwLHRoaXMuTmR8fChlLncoay5sdSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5qYnx8dGhpcy5nLmNjKXtlLmdiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmJmKys7dGhpcy5IYj10aGlzLlRjPSExO3RyeXt0aGlzLnlkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5GZD0hMTt0cnl7dGhpcy5iLlVoKCl9Y2F0Y2goaCl7fXRoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5NYj0hMTt0aGlzLnBlKCkueGgoKTsKdGhpcy5nLmpiJiZ0aGlzLmcub3JpZ2luLk1lKCk7dGhpcy5nLmNjJiYoYT90aGlzLmcub3JpZ2luLmdoKCk6dGhpcy5nZSgpKX1lbHNlIHRoaXMuZ2UoKX0sb3g6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy55ZCh0aGlzLnZpZGVvKSx0aGlzLnplKCk/dGhpcy5EaCgpOnRoaXMuTWQoYSkpfSxNZDpmdW5jdGlvbihhKXt0aGlzLkhiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnplKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9jfHx0aGlzLlQuVmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZigpKTsKdGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0scmY6ZnVuY3Rpb24oKXtpZih0aGlzLkt3KXRoaXMuTWEoKTtlbHNle3RoaXMuTWI9ITA7dGhpcy5iLm0uUmEmJiF0aGlzLmRmJiZ0aGlzLmIubS5SYSgpJiZlLncoay4kYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5QdyhhKTtpZighdGhpcy5DYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5OZD0hMDtlLncoay4kaCx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UueWUodGhpcy5DYil9Yz0iIjt0aGlzLmcuYWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGM9dGhpcy5nLmFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkZkfHwodGhpcy5GZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5MZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5qYj8odGhpcy5IYj10aGlzLlRjPSExLHRoaXMueWQodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRmQ9ITEsdGhpcy5iLlVoKCksdGhpcy5nLm9yaWdpbi5NZSgpKTp0aGlzLk1hKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlJjLnJlcGxhY2UoIlt0aW1lXSIsZS50Zyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLlBjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMub2M9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkNjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlloLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMubWU9c2V0SW50ZXJ2YWwodGhpcy5qcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG5zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgueGMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LGpxOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5tZSksdGhpcy5MZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnJmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm1lKSx0aGlzLk1kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFJoOmZ1bmN0aW9uKCl7dGhpcy5saHx8KHRoaXMubGg9ITAsdGhpcy5lZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFB3OmZ1bmN0aW9uKGEpe2UudyhrLlhkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5TaHx8dGhpcy52Ynx8KDA9PWEmJih0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKSx0aGlzLlNlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLndlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlJoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5IZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5vYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULnBjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5lZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk5mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuU2g9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudmIpe3RyeXtpZih0aGlzLlliW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuWWIuaW1wcmVzc2lvbiYmdGhpcy5ZYi5jb21wbGV0ZSYmIXRoaXMua2Ype3RoaXMua2Y9ITA7dmFyIGM9dGhpcy5ZYi5jb21wbGV0ZS0KdGhpcy5ZYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmKDEwPmMmJihjPTEwKSwwPmMmJihjPSJuZWdhdGl2ZSIpLGUudHJhY2soZixjLCEwKSl9fWNhdGNoKGgpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9Yz1bXTt0cnl7Yz10aGlzLnRzKHRoaXMuZy5MYSxhKX1jYXRjaChsKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgbT1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5HZC5pbXByZXNzaW9ucyYmZS5rdChtLnVybCx0aGlzLkdkLmltcHJlc3Npb25zKT90aGlzLkVlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5Lbyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHthZElkOnRoaXMuR2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuRCgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKG0udXJsLG0udHlwZSl9Y2F0Y2gocil7fWlmKCFiKXRyeXt0aGlzLmcuTGE9dGhpcy5GcSh0aGlzLmcuTGEsYSl9Y2F0Y2gobil7fX19LEVlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuVC53YShhKSxjJiZhLlBvKGMpLGZ8fChmPXRoaXMuaWcpLHRoaXMuVC5IYShhLGYsdGhpcy5pZywhMSwhMCkpfSx0czpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LEZxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LG54OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLlloLmJpbmQodGhpcyl9LApZaDpmdW5jdGlvbigpe2UudyhrLmFnLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLmVkJiZlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLmFzKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5zYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5nLmxjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMuZy5sYyx0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKX19LmJpbmQodGhpcyksMjAwKX0sWGg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPQp0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuUmMucmVwbGFjZSgiW3RpbWVdIixlLnRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlQuVmMmJihiPXRoaXMuVC5WYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy50Yy5iaW5kKHRoaXMpLDFFMyoKYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSx0YzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy56cTt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5EZCgpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnVjKCk7dGhpcy50YygpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5QYjtjLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Pdy5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk53LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRGQoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy51YygpO3RoaXMudGMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLk9iO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTXcuYmluZCh0aGlzKSk6Zi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mdy5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2guaWQ9dGhpcy5HaDtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2guaW5uZXJIVE1MPSIiO2IuYXBwZW5kQ2hpbGQoYyk7dGhpcy5nLmFmJiZiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoZik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpOwp0aGlzLmNvbnRyb2xzPXRoaXMuamEuYXBwZW5kQ2hpbGQoYik7InZwYWlkIiE9YSYmdGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuTGUoKSk7dGhpcy51YygpfX0sdWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxEZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxOdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYi5ILnBhdXNlZD8odGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsCiEwKSxlLncoay5WZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT3c6ZnVuY3Rpb24oKXt0aGlzLlBkP2Uub2EodGhpcy5PLCJjb250cm9sIiwicGxheSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwicGF1c2UiKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmIuSC5wYXVzZWR8fCh0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5iLkgucGF1c2VkJiYodGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKSl9LEx3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWQ/KHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYi5ILm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudyhrLnJkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxNdzpmdW5jdGlvbigpe3RoaXMuYWM/ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJ1bm11dGUiKTplLm9hKHRoaXMuTywiY29udHJvbCIsIm11dGUiKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWR8fCh0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5yZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sJHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKTt0aGlzLmIuSC5tdXRlZCYmKHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LFFiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLAp0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5RYik7dGhpcy5iZHx8dGhpcy5QY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuY2YoKSl9LGdlOmZ1bmN0aW9uKCl7dGhpcy5iZD0hMDt0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKTtpZigoInByZXJvbGwiPT1lLlBhJiZ0aGlzLlBjfHwicG9zdHJvbGwiPT1lLlBhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlBhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkw7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5DYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwpjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5oZSgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLmhlKCl9ZWxzZSB0aGlzLmhlKCl9LApoZTpmdW5jdGlvbigpe3RoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5iLkJ2KCk7dGhpcy5NYj0hMTtlLncoay55cSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMucGUoKS54aCgpfSxwZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIubSYmKGE9dGhpcy5iLm0pO3JldHVybiBhfSx6ZTpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFJmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUueGUodGhpcy52aWRlbywKYSk/dGhpcy55aCgpOnRoaXMudGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuZy5sYyxhLmR1cmF0aW9uPXRoaXMuZy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuZy5qYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLmVjJiYwPHRoaXMuZWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLmVjKSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlhwKyItIit0aGlzLmJmO3RoaXMuZyYmdGhpcy5nLnpnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuZy56ZygpKTtyZXR1cm4gYX0saWc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBQPWMueWt8fFA7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5sPXRoaXMuYVsxXTt0aGlzLkJvPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVs5XTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLnp1PXRoaXMuYVs5XTt0aGlzLlFyPXRoaXMuYVszXTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzVdfWMua3U9YjtiLnByb3RvdHlwZT17TWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk5sOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Cbzp0aGlzLmZtKGEpfSxmbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ206dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhxOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56dTp0aGlzLlByKGEpfSxQcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXI6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5Mczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB3Yj1jLmt1fHx3Yix2ZD1uZXcgd2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT12ZC5NbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkJhPW51bGw7dGhpcy5aPVtdO3RoaXMuWD1udWxsO3RoaXMuZGM9dGhpcy5mYz0hMTt0aGlzLnRmPSIiO3RoaXMuc2Y9ITE7ZCYmZC5lbXB0eT90aGlzLll0KCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MuS249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmllKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHgodGhpcy51cmwpOmwud2EobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlFhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZXx8Yyl7YT1lLmRnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC53YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLndhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSJ9bC5IYShiLHRoaXMuWHQuYmluZCh0aGlzKSx0aGlzLlV0LmJpbmQodGhpcykpfSx3ZzpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuQmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlBhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChkKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGYpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5QYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUGF8fHRoaXMub3QoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwub3coKSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sb3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxYdDpmdW5jdGlvbihhKXt0aGlzLnJ2KGEpO3RyeXt0aGlzLkJhPWEucmVzcG9uc2VYTUwsdGhpcy5CYXx8KHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5OYSh3LlNkKSl9dGhpcy5aPXRoaXMud2coKTt0aGlzLmZjPXRoaXMuZ2YoKTt0aGlzLmRjPXRoaXMuTGgoKTt0aGlzLloubGVuZ3RoP3RoaXMuemMoKTp0aGlzLnJhKHRoaXMuTmEody5HYyx7ZXJyb3I6dGhpcy5zZj9ELlJkOkQuQWZ9KSl9LFl0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwKKHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk5hKHcuU2QpKX10aGlzLlo9dGhpcy53ZygpO3RoaXMuZmM9dGhpcy5nZigpO3RoaXMuZGM9dGhpcy5MaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy56YygpOnRoaXMucmEodGhpcy5OYSh3LkdjLHtlcnJvcjp0aGlzLnNmP0QuUmQ6RC5BZn0pKX0sVXQ6ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuTmEody56Zix7ZGVwdGg6YX0pKX0semM6ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5aLnNoaWZ0KCk7dGhpcy5xdCgpP3RoaXMueXcoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5GZygpLGcse0FkU3lzdGVtOnRoaXMuWnIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5yYSh0aGlzLk5hKHcuQ2YpKTooYT0wLHRoaXMuZXgoKSYmdGhpcy5RZSh0aGlzLkFxKCkpKX0sTWU6ZnVuY3Rpb24oKXt0aGlzLmZjPyh0aGlzLmZjPTE8dGhpcy5aLmxlbmd0aCwKdGhpcy5aLmxlbmd0aCYmdGhpcy56YygpKTp0aGlzLnBhcmVudC5NZSgpfSxnaDpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMuZGM9MTx0aGlzLloubGVuZ3RoLHRoaXMuWi5sZW5ndGgmJnRoaXMuemMoKSk6dGhpcy5wYXJlbnQuZ2goKX0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52dygpP3RoaXMudXcoKT8hMDooLTEhPXRoaXMucmMoKT90aGlzLnJhKHRoaXMuTmEody52ZikpOnRoaXMucmEodGhpcy5OYSh3LnpqKSksITEpOih0aGlzLnJhKHRoaXMuTmEody5HYyxELkJmKSksITEpfSxRZTpmdW5jdGlvbihhKXthLkxhPWEuTGEuY29uY2F0KHRoaXMuSWUoKSk7YS5qYj1hLmpiP2EuamI6dGhpcy5mYzthLmNjPWEuY2M/YS5jYzp0aGlzLmRjO3RoaXMucGFyZW50LlFlKGEpfSxBcTpmdW5jdGlvbigpe3ZhciBhPW5ldyB4YjthLmR1cmF0aW9uPXRoaXMucmMoKTthLlU9dGhpcy5DZygpO2EubGM9dGhpcy5icygpO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuWXIoKTthLmFmPXRoaXMucnMoYS5kdXJhdGlvbik7CnJldHVybiBhfSxyYTpmdW5jdGlvbihiKXt0aGlzLlgmJihiLkxhPWIuZXJyb3IuY29kZSE9dy52Zi5jb2RlP2IuTGEuY29uY2F0KHRoaXMuY3MoKSk6Yi5MYS5jb25jYXQodGhpcy5scygpKSk7dGhpcy5aLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkliJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuSWImJnRoaXMucGFyZW50LkliKGIpLGE9MCx0aGlzLnpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYiksYT0wKX0sSWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuSWIoYSl9LGtnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLk5hKGEsYikpfSxOYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB5YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LHl3OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sdnc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkNnKCkubGVuZ3RofSwKdXc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnJjKCl9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sTGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlomJjI8PXRoaXMuWi5sZW5ndGgmJiF0aGlzLmdmKCkmJihhPSEwKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxxdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LEZnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJBZFN5c3RlbSIpfSxJZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLlNnKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmJiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5TZyhhLnBhcmVudE5vZGUpOiExfSxsczpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LENnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksVWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHR5OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLAp1cmw6dGhpcy5iYihhW2NdKX0pO3RyeXt2YXIgZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksYj1kLmNvbmNhdChnKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz0KYj10aGlzLmpkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxyYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmJiKHRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scnM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5kdyhkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJgoib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmpkKGEpOiIifSxqZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5Lbnx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meT10aGlzLmFbNl07dGhpcy5acz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtleTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmZ5OnRoaXMuWXMoYSl9LFlzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5aczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMudml8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLmV5KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5VPVtdO3RoaXMubGM9IiI7dGhpcy5CPXRoaXMuY2M9dGhpcy5qYj0hMTt0aGlzLnRlPXRoaXMub3JpZ2luPW51bGx9Yy51bT1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxqczpmdW5jdGlvbigpe2lmKCF0aGlzLnRlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSwKYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnRlPWFbY10pfXJldHVybiB0aGlzLnRlfSx6ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5qcygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx1czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMudW18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVs0XTt0aGlzLldwPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzRdfWMuVnE9YjtiLnByb3RvdHlwZT17UGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFqOnRoaXMuVnAoYSl9LFZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XcDoKdGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYj1jLlZxfHxBYix4ZD1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT14ZC5Qaig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LHpqOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxHYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnRhOiJFTVBUWV9WQVNUIn0sQ2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHpmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp0YToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIix0YToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LGp5Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHRhOiJNRURJQUZJTEVfRVJST1IifSx2Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17QWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sbHk6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHRhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVnU9dGhpcy5hWzldO3RoaXMucWs9dGhpcy5hWzNdO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlF4PXRoaXMuYVs2XTt0aGlzLkF0PXRoaXMuYVsyXTt0aGlzLlBuPXRoaXMuYVsyXTt0aGlzLlhzPXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVszXTt0aGlzLm92PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzhdfWMuZ3k9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZ1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xazoKdGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuUHgoYSl9LFB4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ReDp0aGlzLnp0KGEpfSx6dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXQ6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBuOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Yczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm92OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgQmI9Yy5neXx8QmIseWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9eWQuVXUoNCk7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuY2Q9Yjt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Yaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHliPWMuWGp8fHliO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ5PXRoaXMuYVs1XTt0aGlzLlZ3PXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzldfWMudHQ9YjtiLnByb3RvdHlwZT17YXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ5OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIENiPWMudHR8fENiLHpkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT16ZC5heSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLm09YTt0aGlzLmFiPWEueGcoKTt0aGlzLkw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5MLmlkPWUuZ2EoMTApO3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkE9e307dGhpcy5iZT0hMTt0aGlzLm9iPVtdfWMuRmo9YjtiLnByb3RvdHlwZT17dWc6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxmPTAsYj0wLGU9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9Yi5sZWZ0LGI9Yi50b3ApO2U9e3g6ZiwKeTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudWcoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk5zKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYKKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodzpmdW5jdGlvbigpe3RoaXMuYmU9ITB9LFVoOmZ1bmN0aW9uKCl7dGhpcy5IPUMucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkguaWQ9ImFkWGRpc3BsYXkiLHRoaXMuSC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxtaDpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLiRjLHRoaXMubS52KCkpfSxCdjpmdW5jdGlvbigpe3RoaXMuYmV8fCh0aGlzLm0ucGxheSgpLGUudyhrLmFkLHRoaXMubS52KCkpKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMubS5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0KImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5MLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5MLnN0eWxlLmJveFNpemluZz10aGlzLmFiLnN0eWxlLmJveFNpemluZzt0aGlzLkwuc3R5bGUud2lkdGg9dGhpcy5hYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmFiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5hYik7dGhpcy5tLlJiJiZ0aGlzLm0uUmIoKT90aGlzLm0ueGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMubS5leGl0RnVsbHNjcmVlbigpfSwKTnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG1nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZyh0aGlzLmFiKTtpZihiLnghPXRoaXMuQS54fHxiLnkhPXRoaXMuQS55fHxiLnBvc2l0aW9uIT10aGlzLkEucG9zaXRpb258fGIud2lkdGghPXRoaXMuQS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuQS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5BLndpZHRoJiYKMDx0aGlzLkEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZSgpO3JldHVybn10aGlzLkE9Yjt0aGlzLm0uUmIoKT8odGhpcy5MLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5MLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuTC5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9iLmxlbmd0aDthKyspdGhpcy5vYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkhoKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTGIuYmluZCh0aGlzKSwxMCl9LE5vOmZ1bmN0aW9uKGEpe3RoaXMub2J8fAoodGhpcy5vYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMub2IucHVzaChhKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLkwmJnRoaXMuTC5wYXJlbnROb2RlJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5MKTt0aGlzLkgmJnRoaXMuSC5wYXVzZSYmdGhpcy5ILnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLkZqfHxPLEM9W10sRGI9MDsxMDA+RGI7RGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUuZ2EoMTApO0wuY29udHJvbHM9ITA7Qy5wdXNoKEwpfXZhciBIPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCnopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlN1PXRoaXMuYVsxXTt0aGlzLlh2PXRoaXMuYVs3XTt0aGlzLmdxPXRoaXMuYVs3XTt0aGlzLmVwPXRoaXMuYVsxXTt0aGlzLmZrPXRoaXMuYVs2XTt0aGlzLkV3PXRoaXMuYVs3XTt0aGlzLnF2PXRoaXMuYVs1XTt0aGlzLk1qPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuTXM9YjtiLnByb3RvdHlwZT17UnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlN1OnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mazp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkV3OnRoaXMucHYoYSl9LHB2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xdjp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYj1jLk1zfHxFYixBZD1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1BZC5SdSg0KTsoZnVuY3Rpb24oYyl7Yy5rbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWQoYik7CnRoaXMuZ2coKX0sQWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuRmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBGYj1jLmttfHxGYjsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkdiPXRoaXMuR2J8fCExO3RoaXMuSWY9dGhpcy5LZj10aGlzLk9nPXRoaXMucWE9dGhpcy5sZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcihhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubGY9ITA7dGhpcy5PZyYmdGhpcy5aZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnNiO2EmJmEuTWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5XYygpO3RoaXMuT2c9ITA7dGhpcy5aZigpfS5iaW5kKHRoaXMpKTt0aGlzLlRmKCl9LFpmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2Ipe3RoaXMuV2MoKTtpZighdGhpcy5sZiYmIXRoaXMuV2MoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5sZiYmdGhpcy5JZiYmIXRoaXMuS2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxXYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sRGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sVGY6ZnVuY3Rpb24oKXtpZih0aGlzLldjKCkpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5LZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLklmPWIucXl9dGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRmKCl9LmJpbmQodGhpcyksMTAwKX0sdXk6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuR3koKTohMX0scmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnJjKCk6LTF9LG1zOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElyOmZ1bmN0aW9uKGIsYSl7dGhpcy5HYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkdifHwzMDI9PXRoaXMuR2I/dGhpcy5xYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuR2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT8odGhpcy5zKCksdGhpcy5lYSgpKTpiLm9kKCk/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXMoYik/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgR2I9Yy5qbXx8R2I7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxudDpmdW5jdGlvbigpe3dpbmRvdy5PTy5DbS56by54bz93aW5kb3cuT08uQ20uem8ueG8ub3koZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuT2EoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEZiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBHYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgSGI9Yy5sbXx8SGIsSWI9bmV3IEhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml5PXRoaXMuYVszXTt0aGlzLlRsPXRoaXMuYVs2XTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLmdyPXRoaXMuYVs2XTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzddfWMuR2k9YjtiLnByb3RvdHlwZT17aHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml5OnRoaXMuU2woYSl9LApTbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGw6dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncjp0aGlzLmhyKGEpfSxocjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaXI6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYj1jLkdpfHxKYixCZD1uZXcgSmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1CZC5oeSg0KTsoZnVuY3Rpb24oYyl7Yy5paj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuR2coKX0sR2c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmCihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKbGE6ZnVuY3Rpb24oKXt0aGlzLnNoKCl9LHNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5OJiYoMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgS2I9Yy5panx8S2I7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sVWY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy5zKCJlbXB0eSIpLHRoaXMuZWEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5lYSgpOnRoaXMudSgpKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuVWYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5oanx8TGI7KGZ1bmN0aW9uKGMpe2Muamo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8CihiLkFkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLksoYiksKG5ldyBMYihiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLktyfHwodGhpcy5Lcj0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMudmgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5qanx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkV1PXRoaXMuYVsxXTt0aGlzLnRuPXRoaXMuYVs5XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs4XTt0aGlzLmt4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVs5XX1jLkJwPWI7Yi5wcm90b3R5cGU9e0R1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudG46dGhpcy5WaihhKX0sVmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xajp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTXI6dGhpcy5qeChhKX0sang6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5CcHx8TmIsQ2Q9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPUNkLkR1KDQpOyhmdW5jdGlvbihjKXtjLmVuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7CnZhciBXPWMuZW58fFc7KGZ1bmN0aW9uKGMpe2MuZG49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5RZigiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuUWYoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5xdShhKX0uYmluZCh0aGlzKSk7eS5FcygpfSxxdTpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLnMoKTt0aGlzLmVhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPwohMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBYPWMuZG58fFg7KGZ1bmN0aW9uKGMpe2MuZm49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuc2QmJihiPWUuS3EoYix0aGlzLnNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFcoZCk7CmlmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuc2R8fCh0aGlzLnNkPVtdKSx0aGlzLnNkLnB1c2goYlthXSksZD1uZXcgVyhoKSx0aGlzLkooZCl8fCh0aGlzLksoZCksZj1uZXcgWChkLHRoaXMuRyksZi5jKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxRZjpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSx6dzpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYKIXRoaXMuZGFbYV0pdGhpcy55Y3x8KHRoaXMueWM9W10pLHRoaXMueWMucHVzaChiKSx0aGlzLkF2KCkmJih0aGlzLnpkKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEVzOmZ1bmN0aW9uKCl7aWYodGhpcy55Yylmb3IodmFyIGI9MDtiPHRoaXMueWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy55Y1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmRhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5kYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lnp3KGIpfX0pfSkoYyk7dmFyIE9iPWMuZm58fE9iLHk9bmV3IE9iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWs9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzhdO3RoaXMuU209dGhpcy5hWzFdO3RoaXMuZnY9dGhpcy5hWzFdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuRXI9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzddO3RoaXMuVWk9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtsazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWs6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hdzp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZ2OnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydzp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU3E6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVyOnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5SdDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYj1jLnNqfHxQYixEZD1uZXcgUGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KRGQubGsoNCk7KGZ1bmN0aW9uKGMpe2MuZWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLmVqfHxRYjsoZnVuY3Rpb24oYyl7Yy5maj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMucygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUmI9Yy5manx8UmI7KGZ1bmN0aW9uKGMpe2MuZ2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgUWIoZCk7dGhpcy5KKGUpfHwodGhpcy5LKGUpLChuZXcgUmIoZSx0aGlzLkcpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5nanx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRpPXRoaXMuYVsyXTt0aGlzLnVwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzJdfWMuanI9YjtiLnByb3RvdHlwZT17Q2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYj1jLmpyfHxVYixFZD1uZXcgVWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1FZC5DaSg0KTsoZnVuY3Rpb24oYyl7Yy5YbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlMoYik7dGhpcy5WKGEpO3RoaXMudHYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdHY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiYKdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFBnOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIFZiPWMuWGx8fFZiOyhmdW5jdGlvbihjKXtjLldsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5laT0hMX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5laSYmKHRoaXMuRigpLHRoaXMuZWk9ITAsdGhpcy5LYSgpKTthLkZhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRigpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBXYj1jLldsfHxXYjsoZnVuY3Rpb24oYyl7Yy5ZbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBWYihiW2RdKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBXYihjLHRoaXMuRykpLmMoKSl9fWVsc2UgdGhpcy5JKCl9fSl9KShjKTt2YXIgWGI9Yy5ZbHx8WGIsWT1uZXcgWGIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWo9dGhpcy5hWzZdO3RoaXMueXA9dGhpcy5hWzJdO3RoaXMuQ3E9dGhpcy5hWzddO3RoaXMua2s9dGhpcy5hWzFdO3RoaXMuQm09dGhpcy5hWzhdO3RoaXMuWXg9dGhpcy5hWzVdO3RoaXMueWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuRnQ9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklqOnRoaXMueHAoYSl9LAp4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuQnEoYSl9LEJxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DcTp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua2s6dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJtOnRoaXMuWHgoYSl9LFh4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ZeDp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYj1jLkZ0fHxZYixGZD1uZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1GZC5Iaig0KTsoZnVuY3Rpb24oYyl7Yy5Sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgWmI9Yy5Sbnx8WmI7KGZ1bmN0aW9uKGMpe2MuUW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sSmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5XYXx8KHRoaXMuV2E9W10pO3RoaXMuV2EucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5lYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLmdjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxjOmZ1bmN0aW9uKCl7dGhpcy51KCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnhhP3RoaXMuc3YodGhpcy54YSk6KHRoaXMueGE9dGhpcy5KYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCkpfSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnhhKXt0aGlzLkYoKTtyZXR1cm59aWYoIXRoaXMuZ2Mpe3RoaXMuRigpO3JldHVybn1iPSEwO2lmKHRoaXMuV2EmJgp0aGlzLldhLmxlbmd0aCYmMTx0aGlzLldhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuV2EubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuV2FbYV0mJjMwMyE9dGhpcy5XYVthXSYmNDAzIT10aGlzLldhW2FdJiYoYj0hMSk7aWYoYil0aGlzLnMoImVtcHR5IiksdGhpcy5lYSgpO2Vsc2V7dGhpcy5GKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgJGI9Yy5Rbnx8JGI7KGZ1bmN0aW9uKGMpe2MuU249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5JYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBaYihiLml0ZW0oYSkpO3RoaXMuSihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSyhjKSwKKG5ldyAkYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgYWM9Yy5Tbnx8YWMsYmM9bmV3IGFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl1PXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs2XTt0aGlzLkN0PXRoaXMuYVsxMF07dGhpcy5wcj10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuYXI9dGhpcy5hWzFdO3RoaXMuaXY9dGhpcy5hWzldO3RoaXMudXI9dGhpcy5hWzZdO3RoaXMuZ3A9dGhpcy5hWzZdO3RoaXMucnI9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudXQ9YjtiLnByb3RvdHlwZT17SHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkl1OnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HdTp0aGlzLkJ0KGEpfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Q6dGhpcy5vcihhKX0sCm9yOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wcjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFyOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pdjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXI6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdwOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNjPWMudXR8fGNjLEdkPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUdkLkh1KDQpOyhmdW5jdGlvbihjKXtjLmJsPQpuLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTiYmKDAsdGhpcy5OKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBkYz0KYy5ibHx8ZGM7KGZ1bmN0aW9uKGMpe2MuYWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5yZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NbygpfS5iaW5kKHRoaXMpKSx0aGlzLmRpPSExLHRoaXMuS3g9MUUzLAp0aGlzLm9oPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxyZzpmdW5jdGlvbigpe3RoaXMub2guZG9uZXx8KHRoaXMub2guZG9uZT0hMCx0aGlzLmRpPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jaSgpfS5iaW5kKHRoaXMpLHRoaXMuS3gpKX0sTW86ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGkpO3RoaXMucygpfSxjaTpmdW5jdGlvbigpe3RoaXMueWEoKT8odGhpcy5zKCksdGhpcy5lYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRigpKX0sQWc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5BZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLkFnKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBlYz1jLmFsfHxlYzsoZnVuY3Rpb24oYyl7Yy5jbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuT2Eod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGRjKGMpLHRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IGVjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGZjPWMuY2x8fGZjLGdjPW5ldyBmYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW49dGhpcy5hWzhdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMuTXg9dGhpcy5hWzddO3RoaXMucmw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudnU9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbTp0aGlzLkx4KGEpfSxMeDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXg6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgaGM9Yy52dXx8aGMsSGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLlRuKDQpOyhmdW5jdGlvbihjKXtjLmJuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBpYz1jLmJufHxpYzsoZnVuY3Rpb24oYyl7Yy5hbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMua2MoKX0sa2M6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5DZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2MoKX0uYmluZCh0aGlzKSwxMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LAp1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5hbnx8amM7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBpYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgamMoYiwKdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLmNufHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbOV19Yy5paT1iO2IucHJvdG90eXBlPXtPbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmlpfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5PbCg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuUmU9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLll1KCl9LmJpbmQodGhpcyksNTAwKX0sWXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuUmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuUmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxldzpmdW5jdGlvbigpe3RoaXMuUmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLk5tfHxuYzsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuJGI9MH0sYzpmdW5jdGlvbigpe3RoaXMuY3U9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy4kYnx8KHRoaXMuJGI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy4kYnx8dGhpcy4kYisrLHRoaXMuJGI8PXRoaXMuY3U/KHRoaXMuJGIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmV3KCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgb2M9Yy5NbXx8b2M7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBwYz1jLk9tfHxwYyxxYz1uZXcgcGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHA9dGhpcy5hWzhdO3RoaXMuV249dGhpcy5hWzhdOwp0aGlzLm14PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLmR4PXRoaXMuYVs2XTt0aGlzLmZ0PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLnl0PXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMubnc9YjtiLnByb3RvdHlwZT17Q3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Xbjp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubXg6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFpOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5keDp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRyOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgcmM9Yy5ud3x8cmMsSmQ9bmV3IHJjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9SmQuQ3AoNCk7KGZ1bmN0aW9uKGMpe2MuS209bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLk4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgc2M9Yy5LbXx8c2M7KGZ1bmN0aW9uKGMpe2MuSm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7CmEmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuS2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52cSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmdkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5TdCgpOnRoaXMua2MoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSx2cTpmdW5jdGlvbigpe3RoaXMuR2YoKXx8dGhpcy51KCEwKX0sU3Q6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZCgpOyFiLnZhJiZiLlomJmIubnkmJmIucHkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfSxrYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtjKCl9LmJpbmQodGhpcyksMTAwKX0sZ2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5raClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKS5pZCwKYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLmtoPWJbY10pO3JldHVybiB0aGlzLmtofSxDZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSx1OmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5nZCgpLmFkc0xvYWRlcj90aGlzLkYoITApOnRoaXMuRigpOnRoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB0Yz1jLkptfHx0YzsoZnVuY3Rpb24oYyl7Yy5MbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBzYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IHRjKGMsdGhpcy5HKSkuYygpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIHVjPWMuTG18fHVjLHZjPW5ldyB1YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbM107dGhpcy5oaT10aGlzLmFbMTBdO3RoaXMuWW89dGhpcy5hWzEwXTt0aGlzLlF1PXRoaXMuYVsxMF07dGhpcy53dD10aGlzLmFbNV07dGhpcy5IbT10aGlzLmFbN107dGhpcy5NdT10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsyXX1jLkF3PWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWk6dGhpcy5naShhKX0sZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhpOnRoaXMuWG8oYSl9LApYbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWW86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlF1OnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53dDp0aGlzLkdtKGEpfSxHbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSG06dGhpcy5MdShhKX0sTHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5NdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHdjPWMuQXd8fHdjLEtkPW5ldyB3YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUtkLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKRSYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuVihhKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYjpmdW5jdGlvbigpe3JldHVybiEwfSxGYTpmdW5jdGlvbigpe3ZhciBiO0U/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFo9Yy52bHx8WjsoZnVuY3Rpb24oYyl7Yy51bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5UZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlRlPWIuaWQpO0U/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlRlJiZiIT10aGlzLlRlfHwiYWRlcnJvciIhPWEuZXZlbnR8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm8oImFkZXJyb3IiLGEuSXkpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYWE9Yy51bHx8YWE7KGZ1bmN0aW9uKGMpe2Mud2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihFKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFooYiksYi5tYXx8dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBaKGIpLGIubWE/dGhpcy56ZCgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEUseGM9Yy53bHx8eGMseWM9bmV3IHhjKGZ1bmN0aW9uKGMsYil7Yy5wYXVzZSgpO2lmKGwueWIubGVuZ3RoKXt2YXIgYT1sLnliLnNoaWZ0KCk7CmlmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9ZS5Pdih7IltMT0FEU0NSSVBUXSI6ZS5nYSgxMCksIltVVElMU10iOmUuZ2EoMTApLCJbQ0FMTEJBQ0tdIjplLmdhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS5haC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuYWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHEoYyxiKX1lbHNlIHEoYyxiKX0pO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ4PXRoaXMuYVs4XTt0aGlzLlJ3PXRoaXMuYVs4XTt0aGlzLmt3PQp0aGlzLmFbMl07dGhpcy5lbz10aGlzLmFbNV07dGhpcy50bT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs5XX1jLlJrPWI7Yi5wcm90b3R5cGU9e1V4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WeDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnc6dGhpcy5pdyhhKX0saXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmt3OnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lbzp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudG06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yz1jLlJrfHx6YyxMZD1uZXcgemMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1MZC5VeCg0KTsoZnVuY3Rpb24oYyl7Yy54bj0Kbi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlYoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmd1PWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxPeTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiYKYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuTiYmdGhpcy5OKCkpfX0pfSkoYyk7dmFyIE09Yy54bnx8TTsoZnVuY3Rpb24oYyl7Yy53bj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8KHRoaXMudGI9MCksdGhpcy50YisrLDE1PHRoaXMudGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuUXYoKToKdGhpcy51KCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5uZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTj1jLndufHxOOyhmdW5jdGlvbihjKXtjLnluPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSkpO3RoaXMuemQoKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnlufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHI9CnRoaXMuYVsxMF07dGhpcy5FcT10aGlzLmFbN107dGhpcy5uaj10aGlzLmFbMl07dGhpcy53aj10aGlzLmFbNF07dGhpcy51aj10aGlzLmFbMV07dGhpcy53cD10aGlzLmFbNl07dGhpcy5CaT10aGlzLmFbMTBdO3RoaXMubXY9dGhpcy5hWzddO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMV19Yy5Gaz1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHI6dGhpcy5EcShhKX0sRHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5FcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmo6dGhpcy52aihhKX0sdmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53ajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndwOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CaToKdGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5MbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIENjPWMuRmt8fENjLE1kPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU1kLmtyKDQpOyhmdW5jdGlvbihjKXtjLm9sPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmVnPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuZmEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVnfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTj8oMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7YnE6ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5lZz1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7YnE6ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpOwp2YXIgRGM9Yy5vbHx8RGM7KGZ1bmN0aW9uKGMpe2Mubmw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTXk6ZnVuY3Rpb24oKXt9LHZ2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWYobmV3IGZ1bmN0aW9uKCl7fSk7YS5reT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi52dihhKTt3aW5kb3cuYmU9Yn0sYzpmdW5jdGlvbigpe3RoaXMudXZ8fCh0aGlzLnV2PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmV8fCh0aGlzLnZlPTEpO2lmKDIwPHRoaXMudmUpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmCihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuU2EoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy52ZSsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTApfX0sU2E6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLm8oImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlkoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LAp1OmZ1bmN0aW9uKGIpe3RoaXMuRihiKX19KX0pKGMpO3ZhciBFYz1jLm5sfHxFYzsoZnVuY3Rpb24oYyl7Yy5wbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgRGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLm1hfHx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBFYyhjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRmM9Yy5wbHx8RmMsR2M9bmV3IEZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Iaz10aGlzLmFbNF07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5SbD10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy4kcz1iO2IucHJvdG90eXBlPXtHazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGs6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZzOnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pajp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUmw6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy4kc3x8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPU5kLkdrKDQpOyhmdW5jdGlvbihjKXtjLmZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuZmx8fGJhOyhmdW5jdGlvbihjKXtjLmRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLkxnPTA7dGhpcy5XPXRoaXMuV3x8ITE7CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnZjPXRoaXMueGE9dGhpcy5TYz0hMTt0aGlzLnVoPWUud2IoMTApO3RoaXMuVWcoKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlNhKCksITA7dGhpcy5MZysrO2lmKDEwPHRoaXMuTGcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5VZy5iaW5kKHRoaXMpLDEwMCksITF9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52YTtpZihiKXt2YXIgYT0iYWRFcnJvciIsCmM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApOwp0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmCmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGNhPWMuZGx8fGNhOyhmdW5jdGlvbihjKXtjLmdsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBJYz1jLmdsfHxJYyxKYz0KbmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk9yPXRoaXMuYVsyXTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnpuPWI7Yi5wcm90b3R5cGU9e05yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Pcjp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBLYz1jLnpufHxLYyxPZD1uZXcgS2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1PZC5Ocig0KTsoZnVuY3Rpb24oYyl7Yy5haz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIExjPWMuYWt8fExjOyhmdW5jdGlvbihjKXtjLiRqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLAp0aGlzLnUoKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIE1jPWMuJGp8fE1jOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLk9hKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgTGMoZCksZC5tYXx8dGhpcy5KKGQpfHwodGhpcy5LKGQpLChuZXcgTWMoZCx0aGlzLkcpKS5jKCkpOwplbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5jPWMuYmt8fE5jLE9jPW5ldyBOYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbOV07dGhpcy5Hdz10aGlzLmFbNl07dGhpcy5udT10aGlzLmFbOF07dGhpcy5Gdj10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbNF07dGhpcy5GaT10aGlzLmFbNV07dGhpcy5kaj10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbMl07dGhpcy5YcT10aGlzLmFbNF07dGhpcy5pbD10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLnhyPWI7Yi5wcm90b3R5cGU9e0NsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EbDp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3c6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm51OnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuRnY6dGhpcy5icihhKX0sYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZGo6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpzOnRoaXMuV3EoYSl9LFdxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5YcTp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYz1jLnhyfHxQYyxQZD1uZXcgUGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1QZC5DbCg0KTsoZnVuY3Rpb24oYyl7Yy5oaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5WKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgUWM9Yy5oa3x8UWM7KGZ1bmN0aW9uKGMpe2MuZ2s9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuV2YoKX0sV2Y6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldmKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgUmM9Yy5na3x8UmM7KGZ1bmN0aW9uKGMpe2MuaWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFFjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSihiKSl7dGhpcy5LKGIpOyhuZXcgUmMoYix0aGlzLkcpKS5jKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBTYz1jLmlrfHxTYyxUYz1uZXcgU2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnE9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLnVpPQp0aGlzLmFbNF07dGhpcy53cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs1XX1jLiRrPWI7Yi5wcm90b3R5cGU9e01xOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnE6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLiRrfHxVYyxRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5NcSg0KTsoZnVuY3Rpb24oYyl7Yy5taT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTsKYj8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLmZhKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIFZjPWMubWl8fFZjOyhmdW5jdGlvbihjKXtjLmxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuY2UoKTt0aGlzLlNmKCl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMDt0aGlzLnMoImVtcHR5IHZhc3QiKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlNmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5jZS5iaW5kKHRoaXMpLDEwMCl9LGNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKInBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2EuYmluZCh0aGlzKSwxMCksdGhpcy5zKCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy51KCk6dGhpcy51KCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNlLmJpbmQodGhpcyksMTAwKX19LHU6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5LYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMubGl8fFdjOyhmdW5jdGlvbihjKXtjLm5pPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuSSgpfX0pfSkoYyk7dmFyIFhjPWMubml8fFhjLFljPW5ldyBYYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obz10aGlzLmFbNF07dGhpcy5vbT10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbOV07dGhpcy5lbT10aGlzLmFbNV07dGhpcy5FbT10aGlzLmFbOF07dGhpcy5Ebj10aGlzLmFbM107dGhpcy4kcD10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkltPWI7Yi5wcm90b3R5cGU9e2ZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaG86dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5vbTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnE6dGhpcy5kbShhKX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVtOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FbTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG46dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgWmM9Yy5JbXx8WmMsUmQ9bmV3IFpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UmQuZm8oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuV2c9dGhpcy5ZZz10aGlzLlhnPSExO3RoaXMudWQ9W107dGhpcy5XZT0Ke0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdmM/bnVsbDp2YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBCYz9udWxsOkJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeWM/bnVsbDp5YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgT2M/bnVsbDpPYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHFjP251bGw6cWMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJiP251bGw6cmIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhPwpudWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT9udWxsOll9fWMud209YjtiLnByb3RvdHlwZT17YzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5vcyhhKTpbXSxiO3RoaXMuWWc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuemgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLldnKWJyZWFrO2I9dGhpcy5XZVtjXTt0aGlzLm9mKGIpJiYodGhpcy51ZC5wdXNoKGIpLHRoaXMuemgoYikpfX0sb2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxvczpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPQowO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5vZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLm9mKGEpJiZhLmMoKX0sZnc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJiF0aGlzLlhnKWZvcih0aGlzLldnPSEwLGE9MDthPHRoaXMudWQubGVuZ3RoO2ErKyl0aGlzLnVkW2FdLkFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWRbYV0uQWIpfX19KShjKTt2YXIgJGM9Yy53bXx8JGMsSz1uZXcgJGM7Sy5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2k9dGhpcy5hWzldO3RoaXMuJGw9dGhpcy5hWzEwXTt0aGlzLk1rPXRoaXMuYVsxMF07dGhpcy5UeD10aGlzLmFbMl07dGhpcy5idD10aGlzLmFbOV07dGhpcy5xeD10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsxXX1jLlFtPWI7Yi5wcm90b3R5cGU9CntOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Nazp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMucHgoYSl9LHB4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGFkPWMuUW18fGFkLFNkPW5ldyBhZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLk5pKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnFjKGsuZngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnFjKGsuanUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIFRkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry53YygpO0cuUWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLndjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5RZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cud2MoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLnFnKHdpbmRvdyxHLmd0KCkse2lkOlVkfSl9LDUwMCksbGE9ZS5nYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbNl07dGhpcy5hdT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMucHU9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMubD0KdGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17dGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVrOnRoaXMuJHQoYSl9LCR0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5hdTp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm46dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnB1OnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55czp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLmR1fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucmg9CnRoaXMuY29uZj10aGlzLmViPXRoaXMucGxheWVyPW51bGw7dGhpcy5wZD0wO3RoaXMuVmE9IiI7dGhpcy52ZD1bXTt0aGlzLndkPTA7dGhpcy50aD0hMTt0aGlzLlVlPVtdO2UuZ2IoIm5ld0FkZGVsaXZlcnkiKX1jLnJpPWI7Yi5wcm90b3R5cGU9e052OmZ1bmN0aW9uKGEpe3RoaXMucmg9YX0sQmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlZhPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxJdjpmdW5jdGlvbihhKXt0aGlzLmViPWF9LEh2OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVmFdJiZ0aGlzLmNvbmZbdGhpcy5WYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlZhXVthXSk7cmV0dXJuIGJ9LEJjOmZ1bmN0aW9uKGEsYil7ZS51Yigid2VsdC5kZSIpJiZlLlVhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmh0KCkpdGhpcy5lYi5mKHRoaXMuZWIua2QsdGhpcy5lYi5DYSx0aGlzLmViLlZlLGZ1bmN0aW9uKCl7dGhpcy5CYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIubmMpO2Vsc2UgaWYodGhpcy5HcygpKXRoaXMuR3YoZnVuY3Rpb24oKXt0aGlzLkJjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLncoay4kYyx0aGlzLnBsYXllci52KCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBPKHRoaXMuZ2V0UGxheWVyKCksaCk7YiYmbC5odygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLmdiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBQKGwsdGhpcy5lYixoKTtsLkJoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5idShhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxodDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnBkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMucGQuZ2V0VGltZSgpLHRoaXMucGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnBkPWE7cmV0dXJuITF9LFp2OmZ1bmN0aW9uKCl7ZS5nYigicHJlcm9sbCIpOwplLiRlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGcoYSkpP3RoaXMuQmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX0sWXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuJGUoInBvc3Ryb2xsIik7ZS5nYigicG9zdHJvbGwiKTt0aGlzLk52KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmxnKGMpKT90aGlzLkJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX19LGxnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx4djpmdW5jdGlvbigpe3RoaXMucGxheWVyLlN2KHRoaXMuWXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sRWQ6ZnVuY3Rpb24oYSl7ZS5nYigibWlkcm9sbCIpO2UuJGUoIm1pZHJvbGwiKTtpZighdGhpcy5kaCl7dGhpcy5kaD0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5CYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS53KGsuYWQsdGhpcy5wbGF5ZXIudigpKSl9fSx3djpmdW5jdGlvbigpe3RoaXMucGxheWVyLk12KHRoaXMuRWQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSmUoKX0sYzpmdW5jdGlvbigpe3RoaXMuWnYoKTt0aGlzLnBsYXllci5KZSYmdGhpcy53digpO3RoaXMueHYoKX0seXY6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy52ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3goYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLndkPXRoaXMudmQubGVuZ3RofSxHczpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMud2QmJihhPSEwKTtyZXR1cm4gYX0sR3Y6ZnVuY3Rpb24oYSl7dGhpcy50aD1hO2ZvcihhPTA7YTx0aGlzLnZkLmxlbmd0aDthKyspdGhpcy52ZFthXVsiZnVuY3Rpb24iXSh0aGlzLmN2LmJpbmQodGhpcykpfSxjdjpmdW5jdGlvbihhKXt0aGlzLndkLS07YSYmdGhpcy5VZS5wdXNoKGEpOzA+PXRoaXMud2QmJnRoaXMudGgoKX0sYnU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVWUubGVuZ3RoO2MrKyliPXRoaXMuVWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMucml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzFdO3RoaXMuZXI9dGhpcy5hWzNdO3RoaXMuc2s9dGhpcy5hWzldOwp0aGlzLkdyPXRoaXMuYVszXTt0aGlzLk9wPXRoaXMuYVs3XTt0aGlzLlFxPXRoaXMuYVsyXTt0aGlzLlFrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuY209YjtiLnByb3RvdHlwZT17R286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhvOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2k6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJuOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5lcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2s6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdyOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcDp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXE6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5Razp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNkPWMuY218fGNkLFdkPW5ldyBjZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVdkLkdvKDQpfSkuY2FsbChPb3RhZWxvb3llZWJhWmVlLE9vdGFlbG9veWVlYmFaZWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:14 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
truncated
/ Frame 7AEC
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
365f7bbde3749aadffbc7eef47e3b9c1d3381d247db95ba031ae44bb41afb101

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
truncated
/ Frame ED74
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d5d7e39e86102bcd40f61e472248856e51ee4f6f614fc4b71a04b435428e7357

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
288 B
946 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=8507674251
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9vdGFlbG9veWVlYmFaZWU9T290YWVsb295ZWViYVplZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5VYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuQmgobSksYS5GZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5ZcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay4kYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5CZChjKTthLkl2KGwpO2EuSHYobSk7YS55digpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpsPXRoaXMuYVs4XTt0aGlzLmJ4PQp0aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbOV07dGhpcy52bz10aGlzLmFbNl07dGhpcy50bD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLkF1PWI7Yi5wcm90b3R5cGU9e0lsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KbDp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYng6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhwOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkF1fHxrYSxkZD1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1kZC5JbCg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWXA9ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuRGM9W107dGhpcy4kZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJ2LmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5LZz17fX1jLkFrPWI7Yi5wcm90b3R5cGU9e2d3OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rIl8iKTtyZXR1cm4gYX0sZ2I6ZnVuY3Rpb24oYSl7dGhpcy5mYlthXXx8KHRoaXMuZmJbYV09MCk7dGhpcy5mYlthXSs9MTs1PHRoaXMuZmJbYV0mJiF0aGlzLktnW2FdJiYodGhpcy5LZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmd3KCksITApKX0sJGY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sCnNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxidjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5hdihhLmRhdGEpfSxhdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuY2EuZXZlbnRsaXN0ZW5lci5sZW5ndGgsCmQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sWWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sZGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuJGcoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHwKYls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuUnIoYSkpcmV0dXJuOyhiPXRoaXMuZGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxScjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxvZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxPYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHlnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxIaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKVGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx4ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OwowPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0seWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktCmEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoYSl9LmJpbmQodGhpcyksMTAwKX0sd2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxJPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrOwpjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUk7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMTg1OTc3NTM5MyYKNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0k9SStsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihJKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LHBiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJgoxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxtdDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGllOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLAplPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iub2I/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChuKXt9YS5pc1BoYW50b21KUz0KYjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LGFzOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5pZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFFhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGtqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApSczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxYbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5WaSgpfHxhLmtqKCl8fGEuUnMoKXx8YS5tbSgpfHxhLlhuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGhkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxLcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxkdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx0ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVGgoYikrIjoiK3RoaXMuVGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFRoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSwkZTpmdW5jdGlvbihhKXt0aGlzLlBhPWF9LHFnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUGE7dGhpcy5PZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHFjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5xZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZWQpe3ZhciByPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYocj1rLlRhKGEsYikpO2YmJihyPWsuVGEocixmKSk7YyYmKHI9ay5UYShyLGMpKTtoJiYocj1rLlRhKHIsaCkpO2VkJiYocj1rLlRhKHIsaCkpO2UucWMocil9LGR2OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSYmMTAyMyE9YS5jb2RlJiYxMDE4IT1hLmNvZGUpe3RyeXtpZihsYSYmKGIuc2Vzc2lvbl9pZD1sYSksYi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iLGEuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKSxiLmV2ZW50PWEuY29kZSxiLnNpdGVfaHJlZj0KdGhpcy5xcygpLGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH19Y2F0Y2goZCl7fXJldHVybiBifX0sT2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kdihhKTtpZihiKWlmKCFsfHwhbC5iYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwueGQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wud2EoYSwhMCk7YT1sLndhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIjthLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wuSGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5FY3x8KHRoaXMuRWM9e30pO3RoaXMuRWNbZl18fCh0aGlzLkVjW2ZdPTApO3RoaXMuRWNbZl0rKzsxMDx0aGlzLkVjW2ZdfHwoZj1sLnhkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLndhKGYsITApLGY9bC53YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIisKZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxHZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwua3EoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxvZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoPwp0aGlzLmJiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxxZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5qZChhKToiIn0samQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGFxOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuQWUoYSl8fHRoaXMucHQoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5ZZSYmd2luZG93LnNhbmRib3guWWVbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7CmlmKHRoaXMub2coYSkpcmV0dXJuIHRoaXMub2coYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnBiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuVWEoYSxiLkdhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLm5kKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLlJvKGMsYSk7cmV0dXJuIGN9LFVhOmZ1bmN0aW9uKGEsYiwKZCxmLGMsaCxlLHIpe3ZhciBrPWh8fGw7aD0hMDtyJiYoaD0hMSk7aWYoayYmay5iYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2sud2EoYSxoKTtoPWsud2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBrLkhhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYShhLGIsZCxmLGMsayxlLHIpfS5iaW5kKHRoaXMpLDUwMCl9LCRnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciByPSEwO2UmJihyPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHIpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxXdDpmdW5jdGlvbihhLGIsZCl7dGhpcy4kZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5EYylmb3IodmFyIGMgaW4gdGhpcy5EYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxhaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlVhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuV3QoZi5uZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRjPWF9LFd4OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5VYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxNcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sa3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuQWt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93Lm1nPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fAp7fX1jLnprPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuVHU9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuaXU9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSng9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Bcj17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5OZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuSW89e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5peD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnlxPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5hZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLiRjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5MZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuTG89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5PYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVmQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuWGQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLktvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi4kaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLmx1PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IucmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5iZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSXg9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZng9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5qdT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMuemt8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnJvPXRoaXMuYVsyXTt0aGlzLlVxPXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxXTt0aGlzLkFwPXRoaXMuYVs3XTt0aGlzLiRtPXRoaXMuYVs1XTt0aGlzLnN1PXRoaXMuYVs2XTt0aGlzLktqPXRoaXMuYVsyXTt0aGlzLiR1PXRoaXMuYVsxMF07dGhpcy5icD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs3XX1jLnNxPWI7Yi5wcm90b3R5cGU9e3FvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybzp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MdDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXA6dGhpcy5abShhKX0sWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLiRtOnRoaXMucnUoYSl9LHJ1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zdTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktqOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kdTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYT1jLnNxfHxtYSxmZD1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1mZC5xbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkJrPWI7Yi5wcm90b3R5cGU9e3JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxxYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4Iil9LGtzOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGZkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5mZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5mZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LHdjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmUodGhpcy5xYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmZkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxndDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndjKCkrIjIifSxRZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlKHRoaXMua3MoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5mZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMuQmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXE9dGhpcy5hWzRdO3RoaXMucG49dGhpcy5hWzddO3RoaXMuVWo9dGhpcy5hWzZdO3RoaXMua2k9dGhpcy5hWzddO3RoaXMuRnA9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5ndj1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXE6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBuOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmppKGEpfSxqaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2k6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5ndnx8bmEsZ2Q9Cm5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWdkLmNxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/CmYuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51Zj1ifSkoYyk7dmFyIEo9Yy51Znx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVszXX1jLk9xPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIG9hPWMuT3F8fG9hLGhkPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWhkLllqKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Mudm09CkouZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5HPW51bGw7dGhpcy5BYz0xMDA7dGhpcy54Yj0wO3RoaXMuSWE9MTUwO3RoaXMuQWI9MDt0aGlzLkp2KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy54Yjw9dGhpcy5JYT8odGhpcy54YisrLHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpOjA+dGhpcy5JYSYmKHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpfSxBdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhiPnRoaXMuSWE/ITA6ITF9LHpkOmZ1bmN0aW9uKCl7dGhpcy54Yj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sSnY6ZnVuY3Rpb24oYil7dGhpcy5HPWJ9LGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sSzpmdW5jdGlvbihiKXt0aGlzLkphW2IucWIoKV09YjtLJiZLLllnJiZLLmZ3KGIpfSxBeTpmdW5jdGlvbigpe3JldHVybiBlLk9hKHRoaXMuSmEpfSwKSjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9LGx0OmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTnk6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy52bXx8dDsoZnVuY3Rpb24oYyl7Yy54bT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkFjPTEwO3RoaXMueGI9MDt0aGlzLklhPTUwO3RoaXMuTj1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnNiPSIiO3RoaXMuaGc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApnPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt9LFN2OmZ1bmN0aW9uKGIpe3RoaXMuTj1ifSxCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk59LE12OmZ1bmN0aW9uKGIpe3RoaXMuS2U9Yn0senk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sSmU6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLnhiPD10aGlzLklhJiYodGhpcy54YisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuQWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LHhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEFkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sUHk6ZnVuY3Rpb24oKXt9LFY6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSHMoKXx8dGhpcy5PbygpO3RoaXMuQWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKQ3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sT286ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZ2EoMTApKX0sSHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFM6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxIeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxmYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxEZTpmdW5jdGlvbigpe3JldHVybiExfSxDaDpmdW5jdGlvbihiKXt0aGlzLnNiPWJ9LHl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2J9LHhoOmZ1bmN0aW9uKCl7dGhpcy5zYj1udWxsfSxFeTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuc2ImJihiPSEwKTtyZXR1cm4gYn0sSnk6ZnVuY3Rpb24oKXt0aGlzLmhnfHwodGhpcy5oZz0hMCl9LHNjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHZ5OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIG49Yy54bXx8bjsoZnVuY3Rpb24oYyl7Yy5zaT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLkRmPSIxIjt0aGlzLkVmPSIyIjt0aGlzLnlvPSIzIjt0aGlzLkljPTA7dGhpcy5laD0zMDt0aGlzLkZiPVtdO3RoaXMuWmE9W107dGhpcy5iYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5QZj10aGlzLldoPSExO3RoaXMuc3RhdHVzPXRoaXMuSWM7dGhpcy5pZD1lLmdhKDEwKTt0aGlzLkJkKGIpO3RoaXMuS3YoYSl9LGM6ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7dGhpcy5XaHx8KHRoaXMuV2g9ITAsZS5HZSgpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtTJiZTLk1iJiYhcGEmJihwYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sRjpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLlB2KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5QaCgpLHRoaXMuUGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLkZiLnB1c2goYiksdGhpcy5aYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkZiJiYwPHRoaXMuRmIubGVuZ3RoJiYodGhpcy5GYj1lLnVuaXF1ZSh0aGlzLkZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5GYi5qb2luKCIsIikpKTtpZih0aGlzLlphKXtmb3IodmFyIGc9MDtnPHRoaXMuWmEubGVuZ3RoO2crKyl0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXT09dGhpcy5iY1tiXSYmYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSx0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXTwKdGhpcy5iY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSxiPXRoaXMuWmFbZ10ucmVhc29uKTt0aGlzLmJjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LFB2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZn0sUXY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnlvfSxLYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSWN9LEdmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxteTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5FZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuSWN9LEJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPQpifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEt2OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxoczpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LFp0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5zaXx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbD10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbNV07dGhpcy5Uaz10aGlzLmFbMl07dGhpcy5Ebz10aGlzLmFbNF07dGhpcy5QdD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs2XX1jLlhpPWI7Yi5wcm90b3R5cGU9e1VsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WbDp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQmo6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRrOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuRG86dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlB0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5YaXx8cWEsaWQ9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuVWwoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSwKaWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTiYmdGhpcy5OKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5Eanx8VDsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuT2Q9bnVsbDt0aGlzLnJ4PTFFMzt0aGlzLm5oPW51bGw7dGhpcy5Kdz0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub2IpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Kci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuRHMuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5DcyhhLApiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV4KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52eChiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkJzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy53cShhKX0uYmluZCh0aGlzKSl9LHdxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sdXg6ZnVuY3Rpb24oYil7dGhpcy5PZHx8KHRoaXMuT2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd4KGIpfS5iaW5kKHRoaXMpLHRoaXMucngpKX0sd3g6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2QpO3RoaXMuRigpfSx2eDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZCl9LApCczpmdW5jdGlvbihiKXt0aGlzLnN5KGIpO3RoaXMubmg9bmV3IERhdGU7dGhpcy5uaC10aGlzLld1PHRoaXMuSnc/dGhpcy5GKCk6dGhpcy5zKCl9LERzOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuQmQobmV3IFQoYSkpKTt0aGlzLkYoKX0sSnI6ZnVuY3Rpb24oKXt9LENzOmZ1bmN0aW9uKCl7dGhpcy5XdT1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk9hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZywKdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRWp8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rdj10aGlzLmFbNV07dGhpcy5Qcz10aGlzLmFbM107dGhpcy51dT10aGlzLmFbNl07dGhpcy4keD10aGlzLmFbN107dGhpcy5Paz10aGlzLmFbMTBdO3RoaXMucm49dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMl19Yy5Haj1iO2IucHJvdG90eXBlPXtqdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Y6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51dTp0aGlzLlp4KGEpfSxaeDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHg6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9rOgp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1YT1jLkdqfHx1YSxqZD1uZXcgdWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1qZC5qdig0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3RoaXMubmcoKTt0aGlzLnBnKCk7dGhpcy54cT0hMX0sbmc6ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5OYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxwZzpmdW5jdGlvbigpe2lmKCF0aGlzLk5iKXt2YXIgYj0KdGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuTmI9ITApO3RoaXMuVihhKX19LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTiYmKDAsdGhpcy5OKSgpfS5iaW5kKHRoaXMpKX0sSmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5FZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcykpfSxFZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLktlJiYoMCx0aGlzLktlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTsKcmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgdmE9Yy5Za3x8dmE7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTTpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkljO3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMX0sYzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/CmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuV2Q9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmxiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5sYj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5sYj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMubGI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTsKdGhpcy5LYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuZWgmJiF0aGlzLmhhKCkmJih0aGlzLmxiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMuaGEoKSYmKHRoaXMuS2EoKSx0aGlzLmdldFBsYXllcigpLnhxPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5zYjthJiYoYS50ZCgpLGEuZ2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuS2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5laCYmIXRoaXMuaGEoKSYmKHRoaXMubGI/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLk1jLmluZGV4T2YoYSkmJnRoaXMuTWMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5lYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm8oImFkZXJyb3IiLGIuY29kZSksdGhpcy5NYy5sZW5ndGg+PXRoaXMuV2QmJnRoaXMudSgpKX0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5pKCJKVzogIitiLnR5cGUpfSx1OmZ1bmN0aW9uKGIpe2I/dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xOnRoaXMua2U/dGhpcy5rZSsrOnRoaXMua2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSGgoYS52aWRlb1RhZyk/YS5OYj90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLktjfHx0aGlzLmlzUGxheWluZz8odGhpcy5rZT50aGlzLmxlJiYoYj0hMSksdGhpcy5GKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEubmcoKSxhLnBnKCksYS5OYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgd2E9Yy5Ya3x8d2E7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5kcygpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IHZhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5KKGcpfHx0aGlzLmx0KGcpfHwodGhpcy5LKGcpLGc9bmV3IHdhKGcsdGhpcy5HKSxnLk0oKSxnLmMoKSl9fXRoaXMuSSgpfX0seHk6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sZHM6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnBiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB4YT1jLlprfHx4YSx5YT1uZXcgeGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBqPXRoaXMuYVs2XTt0aGlzLkN3PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuSWs9YjtiLnByb3RvdHlwZT17b2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBqOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMuSWt8fHphLGtkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWtkLm9qKDQpOyhmdW5jdGlvbihjKXtjLlpuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTsKdmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLlpufHxBYTsoZnVuY3Rpb24oYyl7Yy5Zbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHwKYi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5Zbnx8QmE7KGZ1bmN0aW9uKGMpe2MuJG49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5PYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPQpiW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IEFhKGcpLHRoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuJG58fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ibj10aGlzLmFbNF07dGhpcy5LdT10aGlzLmFbMV07dGhpcy5Udz10aGlzLmFbOV07dGhpcy54dT10aGlzLmFbNV07dGhpcy5KdD10aGlzLmFbMV07dGhpcy5IdD10aGlzLmFbMl07dGhpcy5CbD10aGlzLmFbOF07dGhpcy5rcD10aGlzLmFbNF07dGhpcy5iaj10aGlzLmFbNF07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVszXX1jLlFzPWI7Yi5wcm90b3R5cGU9e0duOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ibjp0aGlzLkp1KGEpfSwKSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkt1OnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Udzp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh1OnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KdDp0aGlzLkd0KGEpfSxHdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHQ6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJsOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5haihhKX0sYWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJqOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuUXN8fEVhLGxkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5Hbig0KTsoZnVuY3Rpb24oYyl7Yy5Nbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5pYihiKX0uYmluZCh0aGlzKSl9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuTW58fEZhOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucWE9dGhpcy52Yz10aGlzLnhhPXRoaXMuU2M9ITE7dGhpcy51aD1lLndiKDEwKTt0aGlzLlZoPSEwO3RoaXMuZ2M9dGhpcy5OZz0hMTt0aGlzLmloKCk7dGhpcy5ocSgpO3RoaXMuU2EoKX0sS3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLnFiKCksCiI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRGE/Yi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5EYT90eXBlb2YgYi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuRGE/Yi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi5EYT90eXBlb2YgYi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlRkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuVGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuVWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS52YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi52YToidW5kZWZpbmVkWCIsIjsiLGIuUj8KdHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuWmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5yYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudmF9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmMpe3ZhciBiPXRoaXMucmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy52Yz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMudmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy52Y30sanQ6ZnVuY3Rpb24oKXtpZighdGhpcy5NZyl7dmFyIGI9CnRoaXMucmIoKSxhPXRoaXMuaXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk1nPSEwKX1yZXR1cm4gdGhpcy5NZ30saXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5TYz0hMCk7cmV0dXJuIHRoaXMuU2N9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxYZTpmdW5jdGlvbigpe3RoaXMuZ2M9ITA7dmFyIGI9dGhpcy5CZygpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlFhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5oYz0hMDtpZihlLnViKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSx3eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2cmJmIuYWRzJiYodGhpcy5jZz1iLmFkcyk7cmV0dXJuIHRoaXMuY2d9LGhxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLkthKCk7dGhpcy5hYSghMCk7dGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7CnRoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQmcoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksNTApfSxpaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5qdCgpKXt2YXIgYT0KdGhpcy5yYigpLGc9dGhpcy5KYigpO2EmJmcmJih0aGlzLnJiKCksdGhpcy5KYigpLHRoaXMuZ2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nYz90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMucmIoKX1lbHNlIHRoaXMuTmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJiKCksYj10aGlzLkpiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5hYSgpKToodGhpcy5hYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuTmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5paCgpfS5iaW5kKHRoaXMpLDUwKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0saXE6ZnVuY3Rpb24oKXt0aGlzLm1jfHwodGhpcy5tYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMubWMhPWIuYWRzLnN0YXRlJiYodGhpcy5tYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5tYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLm1jPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pcSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXswPD1lLmhkKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlc/dGhpcy51KCEwKToodGhpcy5xYT0hMCx0aGlzLnMoImVtcHR5IHZhc3QiKSl9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwodGhpcy5WaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkYodGhpcy5WaCxmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbnE6ZnVuY3Rpb24oKXt0aGlzLkZ5fHwoMTA8dGhpcy5zeD8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN4KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuenYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnEoKX0uYmluZCh0aGlzKSw1MCkpKX0senY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLnR4KXt0aGlzLnR4PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIEdhPWMuTG58fEdhOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkloKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5JaChiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxJaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS5PYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm1hfHx0aGlzLkooYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuSyhhKSwobmV3IEdhKGEsdGhpcy5HKSkuYygpKSk7cmV0dXJuITB9cmV0dXJuITF9LEk6ZnVuY3Rpb24oKXt0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMuQWMpfX0pfSkoYyk7dmFyIEhhPWMuTm58fEhhLElhPW5ldyBIYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ucj10aGlzLmFbOV07dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VcD10aGlzLmFbNV07dGhpcy5vcD10aGlzLmFbN107dGhpcy5IbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5tcD10aGlzLmFbM107dGhpcy5xcD10aGlzLmFbMV07dGhpcy5Gbz0KdGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNl19Yy5PeD1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubnI6dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KcDp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXA6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vcDp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGw6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldvOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXA6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFwOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7CnZhciBKYT1jLk94fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5tcig0KTsoZnVuY3Rpb24oYyl7Yy5sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7Yi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlMoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0sbGE6ZnVuY3Rpb24oKXt9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLk4mJgoidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLAphPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5sbnx8S2E7KGZ1bmN0aW9uKGMpe2Mua249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuS2I9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWmI9ITE7dGhpcy53aCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT1iLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlpiPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTsKYi5nZXRQbGF5ZXIoKTt0aGlzLlhjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuWWYoKTp0aGlzLnMoKX0sWGM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7YS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuWmI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7CmEuZ2V0UGxheWVyKCk7dGhpcy5aYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMucygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhjLmJpbmQodGhpcyksMTAwKX19LFlmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmCih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LYiksdGhpcy5zKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5LYiYmKHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHwodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkYoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5ZZi5iaW5kKHRoaXMpLDUwKX19LHdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiYKYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlpiPSEwLHRoaXMucygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53aCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmtufHxMYTsoZnVuY3Rpb24oYyl7Yy5tbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmCnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5tbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR5PXRoaXMuYVs0XTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLk1pPXRoaXMuYVs2XTt0aGlzLlNwPXRoaXMuYVsyXTt0aGlzLlNqPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzddfWMuc3I9YjtiLnByb3RvdHlwZT17Y3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5keTp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGk6dGhpcy5MaShhKX0sTGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5NaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3A6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5zcnx8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuY3koNCk7KGZ1bmN0aW9uKGMpe2MuaG49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZWxfO2F8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5lbD9hPWIuZWwoKToiZnVuY3Rpb24iPT10eXBlb2YgYi5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCgpKSkpO3RoaXMuUyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCihiPWJbMF0pO3RoaXMuVihiKX0saWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YSYmYi5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZTIifSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLm11dGVkJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5tdXRlZCYmKGI9YS5tdXRlZCgpKTtyZXR1cm4gYn0sc2M6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5obnx8UGE7KGZ1bmN0aW9uKGMpe2MuZ249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5YZigpO2Iub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5Kb3x8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygidGltZXVwZGF0ZSIpO3RoaXMuRighMCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX0ZJUlNUX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLm8oImFkc2Vycm9yIik7dGhpcy5BcyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LEFzOmZ1bmN0aW9uKGIpe3ZhciBhPTk5OTk5OTtpZihiLmRhdGEmJmIuZGF0YS5BZEVycm9yKWZvcih2YXIgZyBpbiBiLmRhdGEuQWRFcnJvciliLmRhdGEuQWRFcnJvci5oYXNPd25Qcm9wZXJ0eShnKSYmIm51bWJlciI9PXR5cGVvZiBiLmRhdGEuQWRFcnJvcltnXSYmKGE9Yi5kYXRhLkFkRXJyb3JbZ10sdGhpcy5vKGEpKTs5MDE9PWE/dGhpcy5zKCk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PQphPyh0aGlzLlpiPSEwLHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMuSm89ITAsdGhpcy5zKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5YZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz90aGlzLkYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBRYT1jLmdufHxRYTsoZnVuY3Rpb24oYyl7Yy5qbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UmJiJmdW5jdGlvbiI9PQp0eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy56ZCgpLHRoaXMuSSgpfX0pfSkoYyk7dmFyIFJhPWMuam58fFJhLFNhPW5ldyBSYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kaz10aGlzLmFbMV07dGhpcy5FdD10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsxXX1jLkh3PWI7Yi5wcm90b3R5cGU9e2NrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZGs6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgVGE9Yy5Id3x8VGEsb2Q9bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9b2QuY2soNCk7KGZ1bmN0aW9uKGMpe2MuWmk9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5oaD1hfSxNOmZ1bmN0aW9uKCl7fSxIZTpmdW5jdGlvbihiKXt0aGlzLmhoPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmhoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTt0aGlzLlYoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKUDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgVWE9Yy5aaXx8VWE7KGZ1bmN0aW9uKGMpe2MuWWk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxIZTpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZhPWMuWWl8fFZhOyhmdW5jdGlvbihjKXtjLiRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFVhKGQsYSksdGhpcy5KKGQpfHwoZC5IZShhKSx0aGlzLksoZCksCmQ9bmV3IFZhKGQsdGhpcy5HLGcpLGQuSGUoZyksZC5jKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgV2E9Yy4kaXx8V2EsWGE9bmV3IFdhKGlhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbMTBdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMuSm49dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzldO3RoaXMueGk9dGhpcy5hWzldO3RoaXMuT3U9dGhpcy5hWzZdO3RoaXMuRmw9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy50cT1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXA6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5vOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53czp0aGlzLkluKGEpfSwKSW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpuOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vazp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhpOnRoaXMuTnUoYSl9LE51OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PdTp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYT1jLnRxfHxZYSxwZD1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1wZC5QcCg0KTsoZnVuY3Rpb24oYyl7Yy55bD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07CnRoaXMuUyhiKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxRYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBaYT1jLnlsfHxaYTsoZnVuY3Rpb24oYyl7Yy54bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5RYSgpPwooJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5MYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSkpOnRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyICRhPWMueGx8fCRhOyhmdW5jdGlvbihjKXtjLnpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFphKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgJGEoYix0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFiPWMuemx8fGFiLGJiPW5ldyBhYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy50bz10aGlzLmFbM107dGhpcy5Edj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy5ycT1iO2IucHJvdG90eXBlPXtobTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW06dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRvOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Edjp0aGlzLmooYSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLnJxfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5obSg0KTsoZnVuY3Rpb24oYyl7Yy5xbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLlBlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5mYSgpO3JldHVybn10aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlYoYik6dGhpcy5mYSgpfSxYdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnNiLGc9dGhpcy5xYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5NYiYmKDA8PWcuaW5kZXhPZihkKXx8YS50ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUGU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxSYTpmdW5jdGlvbigpe3RoaXMuUGUrKztpZigxMDx0aGlzLlBlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGxhOmZ1bmN0aW9uKCl7fSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLk4mJnRoaXMuTigpfX0pfSkoYyk7dmFyIGRiPWMucW18fGRiOyhmdW5jdGlvbihjKXtjLnBtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHhhOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8Cih0aGlzLnRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMudGIrKywxNTx0aGlzLnRiKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMubmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy55YSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLnhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkhyPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLkhyPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWHUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMucG18fGViOyhmdW5jdGlvbihjKXtjLnJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5ybXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFxPXRoaXMuYVsxXTt0aGlzLmw9dGhpcy5hWzVdfWMubGo9YjtiLnByb3RvdHlwZT17cHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFxOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5sanx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQucHEoNCk7KGZ1bmN0aW9uKGMpe2Mud2s9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5WKGIuZWxlbWVudCl9LFJiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMud2t8fGliOyhmdW5jdGlvbihjKXtjLnZrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PQpiLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCl9fSl9KShjKTt2YXIgamI9Yy52a3x8amI7KGZ1bmN0aW9uKGMpe2MueGs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMueGt8fGtiLGxiPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbz10aGlzLmFbNF07dGhpcy5Gbj10aGlzLmFbNF07dGhpcy5Laz10aGlzLmFbM107dGhpcy56aT10aGlzLmFbMV07CnRoaXMuTnQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMTBdfWMuV2k9YjtiLnByb3RvdHlwZT17Wm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Gbjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5OdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIG1iPWMuV2l8fG1iLHNkPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXNkLlpvKDQpOyhmdW5jdGlvbihjKXtjLlZrPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTt0aGlzLnBoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuUyhnKTt0aGlzLlYoZyk7dGhpcy5kZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kZCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1xOmZ1bmN0aW9uKCl7ZS5UZyh0aGlzLmRkKTtlLnhlKHRoaXMuZGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tcSgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxEZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIG5iPWMuVmt8fG5iOyhmdW5jdGlvbihjKXtjLlVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCEwKX19KX0pKGMpO3ZhciBwYj1jLlVrfHxwYjsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTsKZS5UZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IHBiKGIsdGhpcy5HKSkuYygpKSk7dGhpcy5BYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5BYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcWI9Yy5Xa3x8cWIscmI9bmV3IHFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs5XTt0aGlzLm1sPXRoaXMuYVs3XTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLlRzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuRm09YjtiLnByb3RvdHlwZT17Y3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMucmo6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tbDp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWHI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgc2I9Yy5GbXx8c2IsdGQ9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuY3QoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkNrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEx2OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSwKYil7dGhpcy5kYXRhW2FdPWJ9LFBvOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuQ2t8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5YYT1hO3RoaXMuc2c9dGhpcy5maT0hMTt0aGlzLmpoPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeChhKSk7dmFyIGU9dGhpcy5EYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC5CZSh0aGlzLlhhLnVybCkmJmwuSmQpe3ZhciBoPW5ldyB4KGEudXJsKTsKaC5MdigiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLm5hKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5uYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuRGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuc2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCwKdGhpcy5YYS51cmwsITEpOnRoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy5maXx8KHRoaXMuRGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLkRiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuRGIuc2VuZChhKX1jYXRjaChjKXtsJiZsLkJlKHRoaXMuWGEudXJsKT9sLkpkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuQmUodGhpcy5YYS51cmwpLHRoaXMuamgmJnRoaXMuamgoKX1yZXR1cm4gdGhpcy5EYn19fSkoYyk7dmFyIHRiPWMuRGt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmpjPSIiO3RoaXMuJGQ9dGhpcy5pYz10aGlzLm5iPW51bGw7dGhpcy5McT10aGlzLnliPXRoaXMuWmc9ITE7dGhpcy5HYT0iIjt0aGlzLlZnPSExO3RoaXMuQ2E9CnRoaXMua2Q9IiI7dGhpcy5SZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLkhnPXRoaXMuVGI9IiI7dGhpcy5qZT0hMTt0aGlzLmhmPTA7dGhpcy55Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5FYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVmI9IiI7dGhpcy56Yj1bXTt0aGlzLldiPVtdO3RoaXMuVWI9IiI7dGhpcy5qZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnVlPSExO3RoaXMub3E9dGhpcy5LZD1udWxsO3RoaXMuRmg9dGhpcy5GYz10aGlzLmpnPXRoaXMubmY9dGhpcy5KZD10aGlzLmFlPXRoaXMuSmM9CiExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMubWQ9MDt0aGlzLkpnPSExO3RoaXMuSWc9MUUzfWMuRWs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuc2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5qYyxhZHRhZ21vZGlmaWVyOnRoaXMubmIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmljLGFkdGFncmVnZXg6dGhpcy4kZCxqc3BvcHVwczp0aGlzLlpnLHNpZGVsb2Fkczp0aGlzLnliLGRpc2FibGV0ZXN0czp0aGlzLkxxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuVmcsZ2xvYmFsQ29uZmlnOnRoaXMua2QsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5SZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5UYixob21hZEFkcGF0aDp0aGlzLkhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuamUsCnRlc3RDb29raWVBdHRlbXB0czp0aGlzLmhmLEhPTUFEX1ZFUklGSUVEOnRoaXMueWYsSE9NQURfQkxPQ0tFRDp0aGlzLndmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkViLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy54Zix0ZXN0SGlkZTp0aGlzLlZiLHRlc3RUYWdzOnRoaXMuemIsdGVzdFRhZ3NKUzp0aGlzLldiLHRlc3RDb29raWU6dGhpcy5VYix0aHJvdHRsZTp0aGlzLmpmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMudWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5vcSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5hZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5KZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5TYixzZXJ2ZXJJZDp0aGlzLkFoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5wYywKdnBhaWQ6dGhpcy5GYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuYWl9fSxGczpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LGVzOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLndiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuTXAoYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5zYSYmIWIpcmV0dXJuIG5ldyB4KGEpO2M9dGhpcy5BZShhKTtlPXRoaXMuemEoYSk7Yz8odGhpcy54YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy54ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmpjfHx0aGlzLm5ifHx0aGlzLmljfHx0aGlzLiRkKSYmKGs9dGhpcy5mdShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdzKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5wYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy54YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxCZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkFlKGEpO3JldHVybiBifSxnczpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5yeTtyZXR1cm4ibm9uZSJ9LG5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy5BaF19LHhkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sZmg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sZXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5maChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pOwpCPVtdO2ZvcihsIGluIGMpQi5wdXNoKGwrIj0iK2NbbF0pO2M9Qj1lbmNvZGVVUklDb21wb25lbnQoQi5qb2luKCImIikpfWVsc2UgYz10aGlzLmZoKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9bD1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWwucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sZnU6ZnVuY3Rpb24oYSl7dGhpcy5qYyYmKGErPXRoaXMuamMpO2lmKHRoaXMubmIpZm9yKHZhciBiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5uYltiXSkpO3RoaXMuaWMmJihhPXRoaXMuZXUoYSx0aGlzLmljKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlZnPSEwO3RoaXMua2Q9YTt0aGlzLkNhPWI7dGhpcy5WZT1kO3RoaXMuS2Q9Yzt0aGlzLm5jPWU7dGhpcy5TYj1ofHx7fTt0aGlzLlZ0KCk7aWYoInN0cmluZyI9PQp0eXBlb2YgdGhpcy5DYSl0aGlzLlR0KCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLlljKCl9Y2F0Y2goayl7dGhpcy5uYSgibm9DbGllbnRDb25maWciKX19LGhiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxWdDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5rZCt0aGlzLlFjKCJnbG9iYWwiKSksdGhpcy56cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLlljKCl9LmJpbmQodGhpcyksITApfSxUdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5RYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLlFjKCJjbGllbnQiKSksdGhpcy5ZYy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuWmUoImNsaWVudCIpO3RoaXMubmEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFFjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLndiKCk7dGhpcy5TYiYmdGhpcy5TYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuU2ImJnRoaXMuU2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5uYz0hMSk7dGhpcy5uYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm5jPwp0aGlzLm5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmJhPXRoaXMuUmc9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMud2YpKTt0aGlzLkJiKCk7ZS5xYyhrLlR1KTsoYj1lLmhkKHRoaXMubmQoKSkpfHwoYj1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx6czpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5UYnx8dGhpcy5HYXx8dGhpcy5ZYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKSwKdGhpcy5CYigpKX19LFljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuQ2F9ZWxzZSBhPXRoaXMuQ2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihhLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlRiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5IZz1hLmFkcGF0aHx8IiI7dGhpcy5qZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkFoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVGImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoPwp0aGlzLnFkKCExKToodGhpcy5zYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5CYigpKX0scWQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB4KHRoaXMueGQoKSksZD10aGlzLnphKHRoaXMuVGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5UYit0aGlzLlFjKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5sdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiY3VzdG9tZXIiKTthP3RoaXMuUG0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5QbT0hMCwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxsdzpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe310aGlzLkpkPXRoaXMuWGIoYi5zdHJpY3QpO3RoaXMubmY9dGhpcy5YYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5qZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucGM9dGhpcy5YYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuWGIoYi5lbmFibGVkKTt0aGlzLlZiPWIudGVzdGhpZGV8fCIiO3RoaXMuemI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLldiPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuamM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1iLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuaWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLiRkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlpnPWIuanNwb3B1cHN8fCExO3RoaXMueWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuRmM9Yi52cGFpZHx8ITE7dGhpcy5TYi52cGFpZD10aGlzLkZjO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5WYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYWk9Yi52bWFwc3x8IiI7dGhpcy5VYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBzKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5qZSYmKHRoaXMuVWI9bnVsbCk7dGhpcy5qZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnVlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy51ZT0hMCx0aGlzLnFkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLkl3KCkmJgoodGhpcy5WYnx8dGhpcy5XYnx8dGhpcy56Ynx8dGhpcy5VYik/dGhpcy5WZT8odGhpcy5zYT10aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5lZSgpLHRoaXMuQmIoKSk6dGhpcy5ydygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN3KCkpfX0scnc6ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy50dygpfSx0dzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLndpZHRoPTE7Yy5oZWlnaHQ9MTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3JjPSJhYm91dDpibGFuayI7dmFyIGg9ZS5nYSgxMCksQj1lLmdhKDEwKSxrPWUuZ2EoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGssZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmEoQikrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UucGIoYShoKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChsKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2lmKDMhPWQpe3ZhciBhPWUuaWUoKTshYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5RYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKTt0aGlzLkJiKCl9LElkOmZ1bmN0aW9uKGEpe3RoaXMuSmM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9CnRoaXMuc2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKGEpKSx0aGlzLkJiKCksdGhpcy5lZSgpKX0scXc6ZnVuY3Rpb24oKXtpZih0aGlzLlZiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlZiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuVmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuTmgoKX1lbHNlIHRoaXMuTmgoKX0sCk1oOmZ1bmN0aW9uKCl7dmFyIGM7dmFyIGQ7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpO3RoaXMud3coYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmVmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5JZCh0aGlzLkhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9dGhpcy56Yj1udWxsLHRoaXMuZWYoKX0sd3c6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpOwp0aGlzLnh3KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5NaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5XYiYmdGhpcy5XYi5sZW5ndGgpe3ZhciBjPXRoaXMuV2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSx4dzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LGVmOmZ1bmN0aW9uKCl7dGhpcy5VYj8odGhpcy5oZisrLHRoaXMuSGEobmV3IHgodGhpcy5VYiksdGhpcy5wdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuSWQodGhpcy54ZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmhmP3RoaXMuZWYoKTp0aGlzLmZmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuS2goKTp0aGlzLmZmKCJBQUEiKX0sS2g6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSk7dGhpcy5CYigpO3RoaXMuZWUoKX0sQmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuUWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5KYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMueWYpKTt0aGlzLktkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuS2QmJnRoaXMuS2QoKX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLm5mJiZ0aGlzLkZzKCkpe3ZhciBhPXRoaXMuZXMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFBoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsYixjLGYsaCxCKXt0aGlzLm1kfHwodGhpcy5tZD0wKTt0aGlzLm1kKys7dGhpcy5tZD50aGlzLklnJiYhdGhpcy5KZyYmKHRoaXMuSmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLklnLCEwKSk7YT1uZXcgdGIoYSxiLGMpO2YmJihhLmZpPSEwKTtoJiZlLm10KCkmJihhLnNnPSEwKTtCJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxWZjpmdW5jdGlvbigpe2UuUWEoKXx8ZS5VYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubmEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMueGMoKXx8KGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTsKaC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxvdzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5haX0sa3E6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5oeC5iaW5kKHRoaXMpLAp0aGlzLmd4LmJpbmQodGhpcykpfSxoeDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuQ3IoKX0sZ3g6ZnVuY3Rpb24oKXt9LENyOmZ1bmN0aW9uKCl7ZS5xYyhrLkJyKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLm5hKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxlZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnliLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMueWIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy55YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBSO3dpbmRvd1tjLndjKCldPXRoaXM7ZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLmpmfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sd2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFhiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLHAsbix2LHUsdztwPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHgucHVzaChlKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PAoyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKHA+Pj4yOSk7eC5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO3A9bDtuPW07dj1xO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl3PWMoZSw1KSsocCZufH5wJnYpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStuJjQyOTQ5NjcyOTU7cT1xK3YmNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciB1Yj1jLkVrfHx1YixsPW5ldyB1Yjt3aW5kb3cudWc9bDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adz10aGlzLmFbNF07dGhpcy5XbT10aGlzLmFbMl07dGhpcy5LaT10aGlzLmFbMV07dGhpcy5jdz10aGlzLmFbMl07dGhpcy5rbD10aGlzLmFbNF07dGhpcy5zdD10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbN107CnRoaXMuVnI9dGhpcy5hWzddO3RoaXMuWW09dGhpcy5hWzNdO3RoaXMuWnE9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMl19Yy53bz1iO2IucHJvdG90eXBlPXtZdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnc6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LaTp0aGlzLmJ3KGEpfSxidzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3c6dGhpcy5qbChhKX0samw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtsOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdDp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Wcjp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlltOnRoaXMuWXEoYSl9LApZcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWnE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB2Yj1jLndvfHx2Yix1ZD1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT11ZC5Zdyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLm0uUD90aGlzLlZhPWEubS5QKCk6dGhpcy5WYT0iIjthLm0uUGcmJmEubS5QZyh7cGF1c2U6dGhpcy50ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLkxlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuJHcuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5hYjt0aGlzLnBsYXllcj10aGlzLmIubTt0aGlzLkhiPXRoaXMuVGM9ITE7dGhpcy5LcD0xRTM7dGhpcy5qYT0KbnVsbDt0aGlzLlQ9Yjt0aGlzLnVhPXt9O3RoaXMudmlkZW89e307dGhpcy5HZD17fTtlLmdiKCJuZXdCaWdBZElkIik7dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmJmPTA7dGhpcy5SYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlJjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlJjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuRmQ9ITE7dGhpcy5iaD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuUGM9ITE7dGhpcy5TaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLk1iPSExO3RoaXMuenE9CmUuZ2EoMTApO3RoaXMuUGI9ZS5nYSgxMCk7dGhpcy5PYj1lLmdhKDEwKTt0aGlzLkdoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm9jPXRoaXMudmI9ITE7dGhpcy5tZT1udWxsO3RoaXMuTmQ9dGhpcy5DYj10aGlzLndlPXRoaXMuU2U9dGhpcy5mZT10aGlzLmJkPXRoaXMuZGY9dGhpcy5hYz10aGlzLlBkPXRoaXMubGg9dGhpcy5lZD10aGlzLkt3PXRoaXMua2I9ITE7dGhpcy5lYz1bXTt0aGlzLlliPXt9O3RoaXMua2Y9ITF9Yy55az1iO2IucHJvdG90eXBlPXtCaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pO3JldHVybiBifSxRaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5QYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULkpjP2UudHJhY2soImFkY2FsbCIsIjEiKToKZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay5Mbyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxGZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5rYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmJmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5ULmxxKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLlFoKCksbmV3IFUodGhpcyxhLHRoaXMuYmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5GYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5RaCgpLG5ldyBVKHRoaXMsYSx0aGlzLmJoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULkZjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLAprZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLk1hKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkZlKGEsYixjKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7dGhpcy5OZD10aGlzLkNiPXRoaXMuZWQ9ITE7dGhpcy5nPWE7dGhpcy5Udih0aGlzLmcpO3RoaXMuRWcoYSk7dGhpcy5lYz10aGlzLnZnKGEpO3RoaXMuWWI9e307dGhpcy5rZj0hMX0sRWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5zcyhhKSksdGhpcy5FZyhhLnBhcmVudCkpfSx2ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMudmcoYS5wYXJlbnQpKSwKYy5wdXNoKHRoaXMuJHIoYSkpKTtyZXR1cm4gY30sJHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHNzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlguZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuY2QmJmEuY2QuZXJyb3ImJmEuY2QuZXJyb3IuY29kZSYmKGI9YS5jZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LkdjLmNvZGU6Yj09RC5SZC5jb2RlP2UudyhrLkp4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpOihlLkdlKCksYj09RC5CZi5jb2RlJiZlLncoay5odSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Bcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuemYuY29kZTplLncoay5peCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQ2YuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5OeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS53KGsuUngsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7CmJyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudyhrLml1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMub2N8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkliKGEpO3RoaXMuTWEoKX0sSWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkxhLmxlbmd0aDspdHJ5e3ZhciBjPWEuTGEucG9wKCk7dGhpcy5FZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sVHY6ZnVuY3Rpb24oYSl7dGhpcy5mZT0KdGhpcy53ZT10aGlzLlNlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7dGhpcy5VbyYmdGhpcy5wbGF5ZXIuc2MoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnNjKCkvCjEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuUW8oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLk9oKGIpPyh0aGlzLlNvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy51cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLlJ2KCkpOnRoaXMuemUoKT90aGlzLkRoKCk6dGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0sUnY6ZnVuY3Rpb24oKXt0aGlzLmFjPXRoaXMuUGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuYWM9ITApO2UuJGYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4udGYmJmUuVG8odGhpcy5nLm9yaWdpbi50Zik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCxhKTt0aGlzLmIubWgoKTt0aGlzLmIuQ2MoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYi5DYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLnBmKCJ2cGFpZCIpO3RoaXMuYWMmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTsKdGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnVzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmFxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5ZZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkxiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmVjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMueHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYKKHRoaXMueXgoKSx0aGlzLmIuTGIoITApLCF0aGlzLkNiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLk5kPSEwO2UudyhrLiRoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnllKHRoaXMuQ2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5MYighMCksdGhpcy5DeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuTGIoITApLAp0aGlzLkd4KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSHgoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuYmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcubGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuYWcsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7CmEuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkJ4KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnp4KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLkF4KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5hYz0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5yZCwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYWM9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5tZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuWWQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSk7ZS5ZZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcykpO3RoaXMuYi5ObyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHp4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLlBkPSEwfSxBeDpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLlBkPSExfSxDeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEJ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHl4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuWWEoImltcHJlc3Npb24iKTtlLncoay5IZiwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sR3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sRXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEZ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLkpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5OZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxEeDpmdW5jdGlvbigpe3RoaXMuTGQoKTtlLllhKCJjb21wbGV0ZSIpfSwKYmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5NYShhKX19LHh4OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudyhrLkl4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7CnRoaXMuYmkoITApfSxRbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnhjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy5veC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sU286ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdGhpcy5NZC5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk1kLmJpbmQodGhpcykpfSxaaDpmdW5jdGlvbihhKXt0aGlzLkhifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGJ8fHRoaXMucWYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxxZjpmdW5jdGlvbihhKXtpZighdGhpcy5UYyYmdGhpcy5PaCh0aGlzLnZpZGVvKSYmIXRoaXMudmImJiF0aGlzLkhiKXt0aGlzLlRjPQohMDt0cnl7aWYoIWUuUWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudmJ8fCh0aGlzLnZiPSEwLHRoaXMueWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmpnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5NYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLm54KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQ2MoKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMuUmYoKTt0aGlzLmIubWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuY2YoKX19LGNmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmQpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJgooYT1hKGUuUGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMubGQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmxkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuTmMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTmMoKX1lbHNlIHRoaXMuTmMoKX0sTmM6ZnVuY3Rpb24oYSl7aWYodGhpcy5sZClmb3IodmFyIGI9MDtiPHRoaXMubGQubGVuZ3RoO2IrKyl0aGlzLmxkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmJkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5NYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkxlKCEwKSx0aGlzLk5jKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLndlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5TZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlFiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuUWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUWIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLlBjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5jZigpKX0uYmluZCh0aGlzKTt0aGlzLnBlKCkuQ2godGhpcyl9LExkOmZ1bmN0aW9uKCl7dGhpcy5ULnBjJiYhdGhpcy52YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLklvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5NYSgpfSxNYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSlpZih0aGlzLmZlPSEwLHRoaXMuTmR8fChlLncoay5sdSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5qYnx8dGhpcy5nLmNjKXtlLmdiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmJmKys7dGhpcy5IYj10aGlzLlRjPSExO3RyeXt0aGlzLnlkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5GZD0hMTt0cnl7dGhpcy5iLlVoKCl9Y2F0Y2goaCl7fXRoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5NYj0hMTt0aGlzLnBlKCkueGgoKTsKdGhpcy5nLmpiJiZ0aGlzLmcub3JpZ2luLk1lKCk7dGhpcy5nLmNjJiYoYT90aGlzLmcub3JpZ2luLmdoKCk6dGhpcy5nZSgpKX1lbHNlIHRoaXMuZ2UoKX0sb3g6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy55ZCh0aGlzLnZpZGVvKSx0aGlzLnplKCk/dGhpcy5EaCgpOnRoaXMuTWQoYSkpfSxNZDpmdW5jdGlvbihhKXt0aGlzLkhiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnplKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9jfHx0aGlzLlQuVmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZigpKTsKdGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0scmY6ZnVuY3Rpb24oKXtpZih0aGlzLkt3KXRoaXMuTWEoKTtlbHNle3RoaXMuTWI9ITA7dGhpcy5iLm0uUmEmJiF0aGlzLmRmJiZ0aGlzLmIubS5SYSgpJiZlLncoay4kYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5QdyhhKTtpZighdGhpcy5DYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5OZD0hMDtlLncoay4kaCx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UueWUodGhpcy5DYil9Yz0iIjt0aGlzLmcuYWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGM9dGhpcy5nLmFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkZkfHwodGhpcy5GZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5MZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5qYj8odGhpcy5IYj10aGlzLlRjPSExLHRoaXMueWQodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRmQ9ITEsdGhpcy5iLlVoKCksdGhpcy5nLm9yaWdpbi5NZSgpKTp0aGlzLk1hKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlJjLnJlcGxhY2UoIlt0aW1lXSIsZS50Zyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLlBjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMub2M9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkNjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlloLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMubWU9c2V0SW50ZXJ2YWwodGhpcy5qcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG5zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgueGMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LGpxOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5tZSksdGhpcy5MZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnJmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm1lKSx0aGlzLk1kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFJoOmZ1bmN0aW9uKCl7dGhpcy5saHx8KHRoaXMubGg9ITAsdGhpcy5lZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFB3OmZ1bmN0aW9uKGEpe2UudyhrLlhkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5TaHx8dGhpcy52Ynx8KDA9PWEmJih0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKSx0aGlzLlNlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLndlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlJoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5IZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5vYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULnBjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5lZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk5mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuU2g9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudmIpe3RyeXtpZih0aGlzLlliW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuWWIuaW1wcmVzc2lvbiYmdGhpcy5ZYi5jb21wbGV0ZSYmIXRoaXMua2Ype3RoaXMua2Y9ITA7dmFyIGM9dGhpcy5ZYi5jb21wbGV0ZS0KdGhpcy5ZYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmKDEwPmMmJihjPTEwKSwwPmMmJihjPSJuZWdhdGl2ZSIpLGUudHJhY2soZixjLCEwKSl9fWNhdGNoKGgpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9Yz1bXTt0cnl7Yz10aGlzLnRzKHRoaXMuZy5MYSxhKX1jYXRjaChsKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgbT1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5HZC5pbXByZXNzaW9ucyYmZS5rdChtLnVybCx0aGlzLkdkLmltcHJlc3Npb25zKT90aGlzLkVlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5Lbyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHthZElkOnRoaXMuR2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuRCgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKG0udXJsLG0udHlwZSl9Y2F0Y2gocil7fWlmKCFiKXRyeXt0aGlzLmcuTGE9dGhpcy5GcSh0aGlzLmcuTGEsYSl9Y2F0Y2gobil7fX19LEVlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuVC53YShhKSxjJiZhLlBvKGMpLGZ8fChmPXRoaXMuaWcpLHRoaXMuVC5IYShhLGYsdGhpcy5pZywhMSwhMCkpfSx0czpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LEZxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LG54OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLlloLmJpbmQodGhpcyl9LApZaDpmdW5jdGlvbigpe2UudyhrLmFnLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLmVkJiZlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLmFzKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5zYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5nLmxjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMuZy5sYyx0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKX19LmJpbmQodGhpcyksMjAwKX0sWGg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPQp0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuUmMucmVwbGFjZSgiW3RpbWVdIixlLnRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlQuVmMmJihiPXRoaXMuVC5WYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy50Yy5iaW5kKHRoaXMpLDFFMyoKYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSx0YzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy56cTt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5EZCgpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnVjKCk7dGhpcy50YygpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5QYjtjLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Pdy5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk53LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRGQoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy51YygpO3RoaXMudGMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLk9iO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTXcuYmluZCh0aGlzKSk6Zi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mdy5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2guaWQ9dGhpcy5HaDtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2guaW5uZXJIVE1MPSIiO2IuYXBwZW5kQ2hpbGQoYyk7dGhpcy5nLmFmJiZiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoZik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpOwp0aGlzLmNvbnRyb2xzPXRoaXMuamEuYXBwZW5kQ2hpbGQoYik7InZwYWlkIiE9YSYmdGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuTGUoKSk7dGhpcy51YygpfX0sdWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxEZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxOdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYi5ILnBhdXNlZD8odGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsCiEwKSxlLncoay5WZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT3c6ZnVuY3Rpb24oKXt0aGlzLlBkP2Uub2EodGhpcy5PLCJjb250cm9sIiwicGxheSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwicGF1c2UiKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmIuSC5wYXVzZWR8fCh0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5iLkgucGF1c2VkJiYodGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKSl9LEx3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWQ/KHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYi5ILm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudyhrLnJkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxNdzpmdW5jdGlvbigpe3RoaXMuYWM/ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJ1bm11dGUiKTplLm9hKHRoaXMuTywiY29udHJvbCIsIm11dGUiKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWR8fCh0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5yZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sJHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKTt0aGlzLmIuSC5tdXRlZCYmKHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LFFiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLAp0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5RYik7dGhpcy5iZHx8dGhpcy5QY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuY2YoKSl9LGdlOmZ1bmN0aW9uKCl7dGhpcy5iZD0hMDt0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKTtpZigoInByZXJvbGwiPT1lLlBhJiZ0aGlzLlBjfHwicG9zdHJvbGwiPT1lLlBhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlBhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkw7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5DYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwpjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5oZSgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLmhlKCl9ZWxzZSB0aGlzLmhlKCl9LApoZTpmdW5jdGlvbigpe3RoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5iLkJ2KCk7dGhpcy5NYj0hMTtlLncoay55cSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMucGUoKS54aCgpfSxwZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIubSYmKGE9dGhpcy5iLm0pO3JldHVybiBhfSx6ZTpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFJmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUueGUodGhpcy52aWRlbywKYSk/dGhpcy55aCgpOnRoaXMudGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuZy5sYyxhLmR1cmF0aW9uPXRoaXMuZy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuZy5qYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLmVjJiYwPHRoaXMuZWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLmVjKSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlhwKyItIit0aGlzLmJmO3RoaXMuZyYmdGhpcy5nLnpnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuZy56ZygpKTtyZXR1cm4gYX0saWc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBQPWMueWt8fFA7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5sPXRoaXMuYVsxXTt0aGlzLkJvPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVs5XTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLnp1PXRoaXMuYVs5XTt0aGlzLlFyPXRoaXMuYVszXTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzVdfWMua3U9YjtiLnByb3RvdHlwZT17TWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk5sOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Cbzp0aGlzLmZtKGEpfSxmbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ206dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhxOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56dTp0aGlzLlByKGEpfSxQcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXI6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5Mczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB3Yj1jLmt1fHx3Yix2ZD1uZXcgd2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT12ZC5NbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkJhPW51bGw7dGhpcy5aPVtdO3RoaXMuWD1udWxsO3RoaXMuZGM9dGhpcy5mYz0hMTt0aGlzLnRmPSIiO3RoaXMuc2Y9ITE7ZCYmZC5lbXB0eT90aGlzLll0KCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MuS249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmllKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHgodGhpcy51cmwpOmwud2EobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlFhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZXx8Yyl7YT1lLmRnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC53YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLndhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSJ9bC5IYShiLHRoaXMuWHQuYmluZCh0aGlzKSx0aGlzLlV0LmJpbmQodGhpcykpfSx3ZzpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuQmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlBhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChkKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGYpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5QYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUGF8fHRoaXMub3QoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwub3coKSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sb3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxYdDpmdW5jdGlvbihhKXt0aGlzLnJ2KGEpO3RyeXt0aGlzLkJhPWEucmVzcG9uc2VYTUwsdGhpcy5CYXx8KHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5OYSh3LlNkKSl9dGhpcy5aPXRoaXMud2coKTt0aGlzLmZjPXRoaXMuZ2YoKTt0aGlzLmRjPXRoaXMuTGgoKTt0aGlzLloubGVuZ3RoP3RoaXMuemMoKTp0aGlzLnJhKHRoaXMuTmEody5HYyx7ZXJyb3I6dGhpcy5zZj9ELlJkOkQuQWZ9KSl9LFl0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwKKHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk5hKHcuU2QpKX10aGlzLlo9dGhpcy53ZygpO3RoaXMuZmM9dGhpcy5nZigpO3RoaXMuZGM9dGhpcy5MaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy56YygpOnRoaXMucmEodGhpcy5OYSh3LkdjLHtlcnJvcjp0aGlzLnNmP0QuUmQ6RC5BZn0pKX0sVXQ6ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuTmEody56Zix7ZGVwdGg6YX0pKX0semM6ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5aLnNoaWZ0KCk7dGhpcy5xdCgpP3RoaXMueXcoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5GZygpLGcse0FkU3lzdGVtOnRoaXMuWnIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5yYSh0aGlzLk5hKHcuQ2YpKTooYT0wLHRoaXMuZXgoKSYmdGhpcy5RZSh0aGlzLkFxKCkpKX0sTWU6ZnVuY3Rpb24oKXt0aGlzLmZjPyh0aGlzLmZjPTE8dGhpcy5aLmxlbmd0aCwKdGhpcy5aLmxlbmd0aCYmdGhpcy56YygpKTp0aGlzLnBhcmVudC5NZSgpfSxnaDpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMuZGM9MTx0aGlzLloubGVuZ3RoLHRoaXMuWi5sZW5ndGgmJnRoaXMuemMoKSk6dGhpcy5wYXJlbnQuZ2goKX0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52dygpP3RoaXMudXcoKT8hMDooLTEhPXRoaXMucmMoKT90aGlzLnJhKHRoaXMuTmEody52ZikpOnRoaXMucmEodGhpcy5OYSh3LnpqKSksITEpOih0aGlzLnJhKHRoaXMuTmEody5HYyxELkJmKSksITEpfSxRZTpmdW5jdGlvbihhKXthLkxhPWEuTGEuY29uY2F0KHRoaXMuSWUoKSk7YS5qYj1hLmpiP2EuamI6dGhpcy5mYzthLmNjPWEuY2M/YS5jYzp0aGlzLmRjO3RoaXMucGFyZW50LlFlKGEpfSxBcTpmdW5jdGlvbigpe3ZhciBhPW5ldyB4YjthLmR1cmF0aW9uPXRoaXMucmMoKTthLlU9dGhpcy5DZygpO2EubGM9dGhpcy5icygpO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuWXIoKTthLmFmPXRoaXMucnMoYS5kdXJhdGlvbik7CnJldHVybiBhfSxyYTpmdW5jdGlvbihiKXt0aGlzLlgmJihiLkxhPWIuZXJyb3IuY29kZSE9dy52Zi5jb2RlP2IuTGEuY29uY2F0KHRoaXMuY3MoKSk6Yi5MYS5jb25jYXQodGhpcy5scygpKSk7dGhpcy5aLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkliJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuSWImJnRoaXMucGFyZW50LkliKGIpLGE9MCx0aGlzLnpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYiksYT0wKX0sSWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuSWIoYSl9LGtnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLk5hKGEsYikpfSxOYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB5YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LHl3OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sdnc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkNnKCkubGVuZ3RofSwKdXc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnJjKCl9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sTGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlomJjI8PXRoaXMuWi5sZW5ndGgmJiF0aGlzLmdmKCkmJihhPSEwKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxxdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LEZnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJBZFN5c3RlbSIpfSxJZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLlNnKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmJiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5TZyhhLnBhcmVudE5vZGUpOiExfSxsczpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LENnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksVWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHR5OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLAp1cmw6dGhpcy5iYihhW2NdKX0pO3RyeXt2YXIgZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksYj1kLmNvbmNhdChnKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz0KYj10aGlzLmpkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxyYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmJiKHRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scnM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5kdyhkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJgoib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmpkKGEpOiIifSxqZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5Lbnx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meT10aGlzLmFbNl07dGhpcy5acz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtleTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmZ5OnRoaXMuWXMoYSl9LFlzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5aczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMudml8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLmV5KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5VPVtdO3RoaXMubGM9IiI7dGhpcy5CPXRoaXMuY2M9dGhpcy5qYj0hMTt0aGlzLnRlPXRoaXMub3JpZ2luPW51bGx9Yy51bT1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxqczpmdW5jdGlvbigpe2lmKCF0aGlzLnRlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSwKYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnRlPWFbY10pfXJldHVybiB0aGlzLnRlfSx6ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5qcygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx1czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMudW18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVs0XTt0aGlzLldwPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzRdfWMuVnE9YjtiLnByb3RvdHlwZT17UGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFqOnRoaXMuVnAoYSl9LFZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XcDoKdGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYj1jLlZxfHxBYix4ZD1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT14ZC5Qaig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LHpqOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxHYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnRhOiJFTVBUWV9WQVNUIn0sQ2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHpmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp0YToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIix0YToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LGp5Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHRhOiJNRURJQUZJTEVfRVJST1IifSx2Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17QWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sbHk6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHRhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVnU9dGhpcy5hWzldO3RoaXMucWs9dGhpcy5hWzNdO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlF4PXRoaXMuYVs2XTt0aGlzLkF0PXRoaXMuYVsyXTt0aGlzLlBuPXRoaXMuYVsyXTt0aGlzLlhzPXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVszXTt0aGlzLm92PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzhdfWMuZ3k9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZ1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xazoKdGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuUHgoYSl9LFB4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ReDp0aGlzLnp0KGEpfSx6dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXQ6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBuOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Yczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm92OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgQmI9Yy5neXx8QmIseWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9eWQuVXUoNCk7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuY2Q9Yjt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Yaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHliPWMuWGp8fHliO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ5PXRoaXMuYVs1XTt0aGlzLlZ3PXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzldfWMudHQ9YjtiLnByb3RvdHlwZT17YXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ5OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIENiPWMudHR8fENiLHpkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT16ZC5heSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLm09YTt0aGlzLmFiPWEueGcoKTt0aGlzLkw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5MLmlkPWUuZ2EoMTApO3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkE9e307dGhpcy5iZT0hMTt0aGlzLm9iPVtdfWMuRmo9YjtiLnByb3RvdHlwZT17dWc6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxmPTAsYj0wLGU9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9Yi5sZWZ0LGI9Yi50b3ApO2U9e3g6ZiwKeTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudWcoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk5zKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYKKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodzpmdW5jdGlvbigpe3RoaXMuYmU9ITB9LFVoOmZ1bmN0aW9uKCl7dGhpcy5IPUMucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkguaWQ9ImFkWGRpc3BsYXkiLHRoaXMuSC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxtaDpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLiRjLHRoaXMubS52KCkpfSxCdjpmdW5jdGlvbigpe3RoaXMuYmV8fCh0aGlzLm0ucGxheSgpLGUudyhrLmFkLHRoaXMubS52KCkpKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMubS5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0KImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5MLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5MLnN0eWxlLmJveFNpemluZz10aGlzLmFiLnN0eWxlLmJveFNpemluZzt0aGlzLkwuc3R5bGUud2lkdGg9dGhpcy5hYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmFiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5hYik7dGhpcy5tLlJiJiZ0aGlzLm0uUmIoKT90aGlzLm0ueGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMubS5leGl0RnVsbHNjcmVlbigpfSwKTnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG1nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZyh0aGlzLmFiKTtpZihiLnghPXRoaXMuQS54fHxiLnkhPXRoaXMuQS55fHxiLnBvc2l0aW9uIT10aGlzLkEucG9zaXRpb258fGIud2lkdGghPXRoaXMuQS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuQS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5BLndpZHRoJiYKMDx0aGlzLkEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZSgpO3JldHVybn10aGlzLkE9Yjt0aGlzLm0uUmIoKT8odGhpcy5MLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5MLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuTC5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9iLmxlbmd0aDthKyspdGhpcy5vYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkhoKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTGIuYmluZCh0aGlzKSwxMCl9LE5vOmZ1bmN0aW9uKGEpe3RoaXMub2J8fAoodGhpcy5vYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMub2IucHVzaChhKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLkwmJnRoaXMuTC5wYXJlbnROb2RlJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5MKTt0aGlzLkgmJnRoaXMuSC5wYXVzZSYmdGhpcy5ILnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLkZqfHxPLEM9W10sRGI9MDsxMDA+RGI7RGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUuZ2EoMTApO0wuY29udHJvbHM9ITA7Qy5wdXNoKEwpfXZhciBIPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCnopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlN1PXRoaXMuYVsxXTt0aGlzLlh2PXRoaXMuYVs3XTt0aGlzLmdxPXRoaXMuYVs3XTt0aGlzLmVwPXRoaXMuYVsxXTt0aGlzLmZrPXRoaXMuYVs2XTt0aGlzLkV3PXRoaXMuYVs3XTt0aGlzLnF2PXRoaXMuYVs1XTt0aGlzLk1qPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuTXM9YjtiLnByb3RvdHlwZT17UnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlN1OnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mazp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkV3OnRoaXMucHYoYSl9LHB2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xdjp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYj1jLk1zfHxFYixBZD1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1BZC5SdSg0KTsoZnVuY3Rpb24oYyl7Yy5rbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWQoYik7CnRoaXMuZ2coKX0sQWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuRmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBGYj1jLmttfHxGYjsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkdiPXRoaXMuR2J8fCExO3RoaXMuSWY9dGhpcy5LZj10aGlzLk9nPXRoaXMucWE9dGhpcy5sZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcihhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubGY9ITA7dGhpcy5PZyYmdGhpcy5aZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnNiO2EmJmEuTWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5XYygpO3RoaXMuT2c9ITA7dGhpcy5aZigpfS5iaW5kKHRoaXMpKTt0aGlzLlRmKCl9LFpmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2Ipe3RoaXMuV2MoKTtpZighdGhpcy5sZiYmIXRoaXMuV2MoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5sZiYmdGhpcy5JZiYmIXRoaXMuS2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxXYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sRGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sVGY6ZnVuY3Rpb24oKXtpZih0aGlzLldjKCkpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5LZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLklmPWIucXl9dGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRmKCl9LmJpbmQodGhpcyksMTAwKX0sdXk6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuR3koKTohMX0scmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnJjKCk6LTF9LG1zOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElyOmZ1bmN0aW9uKGIsYSl7dGhpcy5HYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkdifHwzMDI9PXRoaXMuR2I/dGhpcy5xYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuR2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT8odGhpcy5zKCksdGhpcy5lYSgpKTpiLm9kKCk/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXMoYik/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgR2I9Yy5qbXx8R2I7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxudDpmdW5jdGlvbigpe3dpbmRvdy5PTy5DbS56by54bz93aW5kb3cuT08uQ20uem8ueG8ub3koZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuT2EoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEZiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBHYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgSGI9Yy5sbXx8SGIsSWI9bmV3IEhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml5PXRoaXMuYVszXTt0aGlzLlRsPXRoaXMuYVs2XTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLmdyPXRoaXMuYVs2XTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzddfWMuR2k9YjtiLnByb3RvdHlwZT17aHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml5OnRoaXMuU2woYSl9LApTbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGw6dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncjp0aGlzLmhyKGEpfSxocjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaXI6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYj1jLkdpfHxKYixCZD1uZXcgSmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1CZC5oeSg0KTsoZnVuY3Rpb24oYyl7Yy5paj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuR2coKX0sR2c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmCihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKbGE6ZnVuY3Rpb24oKXt0aGlzLnNoKCl9LHNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5OJiYoMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgS2I9Yy5panx8S2I7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sVWY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy5zKCJlbXB0eSIpLHRoaXMuZWEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5lYSgpOnRoaXMudSgpKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuVWYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5oanx8TGI7KGZ1bmN0aW9uKGMpe2Muamo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8CihiLkFkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLksoYiksKG5ldyBMYihiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLktyfHwodGhpcy5Lcj0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMudmgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5qanx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkV1PXRoaXMuYVsxXTt0aGlzLnRuPXRoaXMuYVs5XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs4XTt0aGlzLmt4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVs5XX1jLkJwPWI7Yi5wcm90b3R5cGU9e0R1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudG46dGhpcy5WaihhKX0sVmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xajp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTXI6dGhpcy5qeChhKX0sang6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5CcHx8TmIsQ2Q9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPUNkLkR1KDQpOyhmdW5jdGlvbihjKXtjLmVuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7CnZhciBXPWMuZW58fFc7KGZ1bmN0aW9uKGMpe2MuZG49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5RZigiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuUWYoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5xdShhKX0uYmluZCh0aGlzKSk7eS5FcygpfSxxdTpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLnMoKTt0aGlzLmVhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPwohMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBYPWMuZG58fFg7KGZ1bmN0aW9uKGMpe2MuZm49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuc2QmJihiPWUuS3EoYix0aGlzLnNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFcoZCk7CmlmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuc2R8fCh0aGlzLnNkPVtdKSx0aGlzLnNkLnB1c2goYlthXSksZD1uZXcgVyhoKSx0aGlzLkooZCl8fCh0aGlzLksoZCksZj1uZXcgWChkLHRoaXMuRyksZi5jKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxRZjpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSx6dzpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYKIXRoaXMuZGFbYV0pdGhpcy55Y3x8KHRoaXMueWM9W10pLHRoaXMueWMucHVzaChiKSx0aGlzLkF2KCkmJih0aGlzLnpkKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEVzOmZ1bmN0aW9uKCl7aWYodGhpcy55Yylmb3IodmFyIGI9MDtiPHRoaXMueWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy55Y1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmRhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5kYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lnp3KGIpfX0pfSkoYyk7dmFyIE9iPWMuZm58fE9iLHk9bmV3IE9iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWs9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzhdO3RoaXMuU209dGhpcy5hWzFdO3RoaXMuZnY9dGhpcy5hWzFdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuRXI9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzddO3RoaXMuVWk9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtsazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWs6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hdzp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZ2OnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydzp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU3E6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVyOnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5SdDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYj1jLnNqfHxQYixEZD1uZXcgUGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KRGQubGsoNCk7KGZ1bmN0aW9uKGMpe2MuZWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLmVqfHxRYjsoZnVuY3Rpb24oYyl7Yy5maj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMucygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUmI9Yy5manx8UmI7KGZ1bmN0aW9uKGMpe2MuZ2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgUWIoZCk7dGhpcy5KKGUpfHwodGhpcy5LKGUpLChuZXcgUmIoZSx0aGlzLkcpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5nanx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRpPXRoaXMuYVsyXTt0aGlzLnVwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzJdfWMuanI9YjtiLnByb3RvdHlwZT17Q2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYj1jLmpyfHxVYixFZD1uZXcgVWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1FZC5DaSg0KTsoZnVuY3Rpb24oYyl7Yy5YbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlMoYik7dGhpcy5WKGEpO3RoaXMudHYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdHY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiYKdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFBnOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIFZiPWMuWGx8fFZiOyhmdW5jdGlvbihjKXtjLldsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5laT0hMX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5laSYmKHRoaXMuRigpLHRoaXMuZWk9ITAsdGhpcy5LYSgpKTthLkZhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRigpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBXYj1jLldsfHxXYjsoZnVuY3Rpb24oYyl7Yy5ZbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBWYihiW2RdKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBXYihjLHRoaXMuRykpLmMoKSl9fWVsc2UgdGhpcy5JKCl9fSl9KShjKTt2YXIgWGI9Yy5ZbHx8WGIsWT1uZXcgWGIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWo9dGhpcy5hWzZdO3RoaXMueXA9dGhpcy5hWzJdO3RoaXMuQ3E9dGhpcy5hWzddO3RoaXMua2s9dGhpcy5hWzFdO3RoaXMuQm09dGhpcy5hWzhdO3RoaXMuWXg9dGhpcy5hWzVdO3RoaXMueWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuRnQ9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklqOnRoaXMueHAoYSl9LAp4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuQnEoYSl9LEJxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DcTp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua2s6dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJtOnRoaXMuWHgoYSl9LFh4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ZeDp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYj1jLkZ0fHxZYixGZD1uZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1GZC5Iaig0KTsoZnVuY3Rpb24oYyl7Yy5Sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgWmI9Yy5Sbnx8WmI7KGZ1bmN0aW9uKGMpe2MuUW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sSmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5XYXx8KHRoaXMuV2E9W10pO3RoaXMuV2EucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5lYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLmdjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxjOmZ1bmN0aW9uKCl7dGhpcy51KCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnhhP3RoaXMuc3YodGhpcy54YSk6KHRoaXMueGE9dGhpcy5KYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCkpfSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnhhKXt0aGlzLkYoKTtyZXR1cm59aWYoIXRoaXMuZ2Mpe3RoaXMuRigpO3JldHVybn1iPSEwO2lmKHRoaXMuV2EmJgp0aGlzLldhLmxlbmd0aCYmMTx0aGlzLldhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuV2EubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuV2FbYV0mJjMwMyE9dGhpcy5XYVthXSYmNDAzIT10aGlzLldhW2FdJiYoYj0hMSk7aWYoYil0aGlzLnMoImVtcHR5IiksdGhpcy5lYSgpO2Vsc2V7dGhpcy5GKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgJGI9Yy5Rbnx8JGI7KGZ1bmN0aW9uKGMpe2MuU249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5JYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBaYihiLml0ZW0oYSkpO3RoaXMuSihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSyhjKSwKKG5ldyAkYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgYWM9Yy5Tbnx8YWMsYmM9bmV3IGFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl1PXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs2XTt0aGlzLkN0PXRoaXMuYVsxMF07dGhpcy5wcj10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuYXI9dGhpcy5hWzFdO3RoaXMuaXY9dGhpcy5hWzldO3RoaXMudXI9dGhpcy5hWzZdO3RoaXMuZ3A9dGhpcy5hWzZdO3RoaXMucnI9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudXQ9YjtiLnByb3RvdHlwZT17SHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkl1OnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HdTp0aGlzLkJ0KGEpfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Q6dGhpcy5vcihhKX0sCm9yOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wcjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFyOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pdjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXI6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdwOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNjPWMudXR8fGNjLEdkPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUdkLkh1KDQpOyhmdW5jdGlvbihjKXtjLmJsPQpuLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTiYmKDAsdGhpcy5OKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBkYz0KYy5ibHx8ZGM7KGZ1bmN0aW9uKGMpe2MuYWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5yZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NbygpfS5iaW5kKHRoaXMpKSx0aGlzLmRpPSExLHRoaXMuS3g9MUUzLAp0aGlzLm9oPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxyZzpmdW5jdGlvbigpe3RoaXMub2guZG9uZXx8KHRoaXMub2guZG9uZT0hMCx0aGlzLmRpPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jaSgpfS5iaW5kKHRoaXMpLHRoaXMuS3gpKX0sTW86ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGkpO3RoaXMucygpfSxjaTpmdW5jdGlvbigpe3RoaXMueWEoKT8odGhpcy5zKCksdGhpcy5lYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRigpKX0sQWc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5BZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLkFnKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBlYz1jLmFsfHxlYzsoZnVuY3Rpb24oYyl7Yy5jbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuT2Eod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGRjKGMpLHRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IGVjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGZjPWMuY2x8fGZjLGdjPW5ldyBmYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW49dGhpcy5hWzhdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMuTXg9dGhpcy5hWzddO3RoaXMucmw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudnU9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbTp0aGlzLkx4KGEpfSxMeDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXg6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgaGM9Yy52dXx8aGMsSGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLlRuKDQpOyhmdW5jdGlvbihjKXtjLmJuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBpYz1jLmJufHxpYzsoZnVuY3Rpb24oYyl7Yy5hbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMua2MoKX0sa2M6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5DZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2MoKX0uYmluZCh0aGlzKSwxMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LAp1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5hbnx8amM7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBpYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgamMoYiwKdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLmNufHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbOV19Yy5paT1iO2IucHJvdG90eXBlPXtPbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmlpfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5PbCg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuUmU9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLll1KCl9LmJpbmQodGhpcyksNTAwKX0sWXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuUmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuUmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxldzpmdW5jdGlvbigpe3RoaXMuUmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLk5tfHxuYzsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuJGI9MH0sYzpmdW5jdGlvbigpe3RoaXMuY3U9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy4kYnx8KHRoaXMuJGI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy4kYnx8dGhpcy4kYisrLHRoaXMuJGI8PXRoaXMuY3U/KHRoaXMuJGIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmV3KCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgb2M9Yy5NbXx8b2M7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBwYz1jLk9tfHxwYyxxYz1uZXcgcGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHA9dGhpcy5hWzhdO3RoaXMuV249dGhpcy5hWzhdOwp0aGlzLm14PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLmR4PXRoaXMuYVs2XTt0aGlzLmZ0PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLnl0PXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMubnc9YjtiLnByb3RvdHlwZT17Q3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Xbjp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubXg6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFpOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5keDp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRyOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgcmM9Yy5ud3x8cmMsSmQ9bmV3IHJjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9SmQuQ3AoNCk7KGZ1bmN0aW9uKGMpe2MuS209bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLk4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgc2M9Yy5LbXx8c2M7KGZ1bmN0aW9uKGMpe2MuSm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7CmEmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuS2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52cSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmdkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5TdCgpOnRoaXMua2MoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSx2cTpmdW5jdGlvbigpe3RoaXMuR2YoKXx8dGhpcy51KCEwKX0sU3Q6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZCgpOyFiLnZhJiZiLlomJmIubnkmJmIucHkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfSxrYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtjKCl9LmJpbmQodGhpcyksMTAwKX0sZ2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5raClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKS5pZCwKYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLmtoPWJbY10pO3JldHVybiB0aGlzLmtofSxDZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSx1OmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5nZCgpLmFkc0xvYWRlcj90aGlzLkYoITApOnRoaXMuRigpOnRoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB0Yz1jLkptfHx0YzsoZnVuY3Rpb24oYyl7Yy5MbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBzYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IHRjKGMsdGhpcy5HKSkuYygpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIHVjPWMuTG18fHVjLHZjPW5ldyB1YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbM107dGhpcy5oaT10aGlzLmFbMTBdO3RoaXMuWW89dGhpcy5hWzEwXTt0aGlzLlF1PXRoaXMuYVsxMF07dGhpcy53dD10aGlzLmFbNV07dGhpcy5IbT10aGlzLmFbN107dGhpcy5NdT10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsyXX1jLkF3PWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWk6dGhpcy5naShhKX0sZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhpOnRoaXMuWG8oYSl9LApYbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWW86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlF1OnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53dDp0aGlzLkdtKGEpfSxHbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSG06dGhpcy5MdShhKX0sTHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5NdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHdjPWMuQXd8fHdjLEtkPW5ldyB3YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUtkLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKRSYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuVihhKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYjpmdW5jdGlvbigpe3JldHVybiEwfSxGYTpmdW5jdGlvbigpe3ZhciBiO0U/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFo9Yy52bHx8WjsoZnVuY3Rpb24oYyl7Yy51bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5UZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlRlPWIuaWQpO0U/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlRlJiZiIT10aGlzLlRlfHwiYWRlcnJvciIhPWEuZXZlbnR8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm8oImFkZXJyb3IiLGEuSXkpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYWE9Yy51bHx8YWE7KGZ1bmN0aW9uKGMpe2Mud2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihFKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFooYiksYi5tYXx8dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBaKGIpLGIubWE/dGhpcy56ZCgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEUseGM9Yy53bHx8eGMseWM9bmV3IHhjKGZ1bmN0aW9uKGMsYil7Yy5wYXVzZSgpO2lmKGwueWIubGVuZ3RoKXt2YXIgYT1sLnliLnNoaWZ0KCk7CmlmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9ZS5Pdih7IltMT0FEU0NSSVBUXSI6ZS5nYSgxMCksIltVVElMU10iOmUuZ2EoMTApLCJbQ0FMTEJBQ0tdIjplLmdhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS5haC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuYWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHEoYyxiKX1lbHNlIHEoYyxiKX0pO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ4PXRoaXMuYVs4XTt0aGlzLlJ3PXRoaXMuYVs4XTt0aGlzLmt3PQp0aGlzLmFbMl07dGhpcy5lbz10aGlzLmFbNV07dGhpcy50bT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs5XX1jLlJrPWI7Yi5wcm90b3R5cGU9e1V4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WeDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnc6dGhpcy5pdyhhKX0saXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmt3OnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lbzp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudG06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yz1jLlJrfHx6YyxMZD1uZXcgemMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1MZC5VeCg0KTsoZnVuY3Rpb24oYyl7Yy54bj0Kbi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlYoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmd1PWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxPeTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiYKYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuTiYmdGhpcy5OKCkpfX0pfSkoYyk7dmFyIE09Yy54bnx8TTsoZnVuY3Rpb24oYyl7Yy53bj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8KHRoaXMudGI9MCksdGhpcy50YisrLDE1PHRoaXMudGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuUXYoKToKdGhpcy51KCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5uZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTj1jLndufHxOOyhmdW5jdGlvbihjKXtjLnluPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSkpO3RoaXMuemQoKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnlufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHI9CnRoaXMuYVsxMF07dGhpcy5FcT10aGlzLmFbN107dGhpcy5uaj10aGlzLmFbMl07dGhpcy53aj10aGlzLmFbNF07dGhpcy51aj10aGlzLmFbMV07dGhpcy53cD10aGlzLmFbNl07dGhpcy5CaT10aGlzLmFbMTBdO3RoaXMubXY9dGhpcy5hWzddO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMV19Yy5Gaz1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHI6dGhpcy5EcShhKX0sRHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5FcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmo6dGhpcy52aihhKX0sdmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53ajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndwOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CaToKdGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5MbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIENjPWMuRmt8fENjLE1kPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU1kLmtyKDQpOyhmdW5jdGlvbihjKXtjLm9sPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmVnPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuZmEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVnfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTj8oMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7YnE6ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5lZz1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7YnE6ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpOwp2YXIgRGM9Yy5vbHx8RGM7KGZ1bmN0aW9uKGMpe2Mubmw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTXk6ZnVuY3Rpb24oKXt9LHZ2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWYobmV3IGZ1bmN0aW9uKCl7fSk7YS5reT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi52dihhKTt3aW5kb3cuYmU9Yn0sYzpmdW5jdGlvbigpe3RoaXMudXZ8fCh0aGlzLnV2PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmV8fCh0aGlzLnZlPTEpO2lmKDIwPHRoaXMudmUpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmCihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuU2EoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy52ZSsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTApfX0sU2E6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLm8oImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlkoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LAp1OmZ1bmN0aW9uKGIpe3RoaXMuRihiKX19KX0pKGMpO3ZhciBFYz1jLm5sfHxFYzsoZnVuY3Rpb24oYyl7Yy5wbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgRGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLm1hfHx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBFYyhjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRmM9Yy5wbHx8RmMsR2M9bmV3IEZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Iaz10aGlzLmFbNF07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5SbD10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy4kcz1iO2IucHJvdG90eXBlPXtHazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGs6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZzOnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pajp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUmw6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy4kc3x8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPU5kLkdrKDQpOyhmdW5jdGlvbihjKXtjLmZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuZmx8fGJhOyhmdW5jdGlvbihjKXtjLmRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLkxnPTA7dGhpcy5XPXRoaXMuV3x8ITE7CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnZjPXRoaXMueGE9dGhpcy5TYz0hMTt0aGlzLnVoPWUud2IoMTApO3RoaXMuVWcoKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlNhKCksITA7dGhpcy5MZysrO2lmKDEwPHRoaXMuTGcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5VZy5iaW5kKHRoaXMpLDEwMCksITF9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52YTtpZihiKXt2YXIgYT0iYWRFcnJvciIsCmM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApOwp0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmCmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGNhPWMuZGx8fGNhOyhmdW5jdGlvbihjKXtjLmdsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBJYz1jLmdsfHxJYyxKYz0KbmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk9yPXRoaXMuYVsyXTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnpuPWI7Yi5wcm90b3R5cGU9e05yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Pcjp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBLYz1jLnpufHxLYyxPZD1uZXcgS2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1PZC5Ocig0KTsoZnVuY3Rpb24oYyl7Yy5haz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIExjPWMuYWt8fExjOyhmdW5jdGlvbihjKXtjLiRqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLAp0aGlzLnUoKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIE1jPWMuJGp8fE1jOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLk9hKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgTGMoZCksZC5tYXx8dGhpcy5KKGQpfHwodGhpcy5LKGQpLChuZXcgTWMoZCx0aGlzLkcpKS5jKCkpOwplbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5jPWMuYmt8fE5jLE9jPW5ldyBOYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbOV07dGhpcy5Hdz10aGlzLmFbNl07dGhpcy5udT10aGlzLmFbOF07dGhpcy5Gdj10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbNF07dGhpcy5GaT10aGlzLmFbNV07dGhpcy5kaj10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbMl07dGhpcy5YcT10aGlzLmFbNF07dGhpcy5pbD10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLnhyPWI7Yi5wcm90b3R5cGU9e0NsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EbDp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3c6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm51OnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuRnY6dGhpcy5icihhKX0sYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZGo6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpzOnRoaXMuV3EoYSl9LFdxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5YcTp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYz1jLnhyfHxQYyxQZD1uZXcgUGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1QZC5DbCg0KTsoZnVuY3Rpb24oYyl7Yy5oaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5WKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgUWM9Yy5oa3x8UWM7KGZ1bmN0aW9uKGMpe2MuZ2s9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuV2YoKX0sV2Y6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldmKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgUmM9Yy5na3x8UmM7KGZ1bmN0aW9uKGMpe2MuaWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFFjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSihiKSl7dGhpcy5LKGIpOyhuZXcgUmMoYix0aGlzLkcpKS5jKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBTYz1jLmlrfHxTYyxUYz1uZXcgU2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnE9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLnVpPQp0aGlzLmFbNF07dGhpcy53cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs1XX1jLiRrPWI7Yi5wcm90b3R5cGU9e01xOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnE6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLiRrfHxVYyxRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5NcSg0KTsoZnVuY3Rpb24oYyl7Yy5taT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTsKYj8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLmZhKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIFZjPWMubWl8fFZjOyhmdW5jdGlvbihjKXtjLmxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuY2UoKTt0aGlzLlNmKCl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMDt0aGlzLnMoImVtcHR5IHZhc3QiKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlNmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5jZS5iaW5kKHRoaXMpLDEwMCl9LGNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKInBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2EuYmluZCh0aGlzKSwxMCksdGhpcy5zKCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy51KCk6dGhpcy51KCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNlLmJpbmQodGhpcyksMTAwKX19LHU6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5LYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMubGl8fFdjOyhmdW5jdGlvbihjKXtjLm5pPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuSSgpfX0pfSkoYyk7dmFyIFhjPWMubml8fFhjLFljPW5ldyBYYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obz10aGlzLmFbNF07dGhpcy5vbT10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbOV07dGhpcy5lbT10aGlzLmFbNV07dGhpcy5FbT10aGlzLmFbOF07dGhpcy5Ebj10aGlzLmFbM107dGhpcy4kcD10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkltPWI7Yi5wcm90b3R5cGU9e2ZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaG86dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5vbTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnE6dGhpcy5kbShhKX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVtOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FbTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG46dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgWmM9Yy5JbXx8WmMsUmQ9bmV3IFpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UmQuZm8oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuV2c9dGhpcy5ZZz10aGlzLlhnPSExO3RoaXMudWQ9W107dGhpcy5XZT0Ke0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdmM/bnVsbDp2YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBCYz9udWxsOkJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeWM/bnVsbDp5YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgT2M/bnVsbDpPYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHFjP251bGw6cWMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJiP251bGw6cmIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhPwpudWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT9udWxsOll9fWMud209YjtiLnByb3RvdHlwZT17YzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5vcyhhKTpbXSxiO3RoaXMuWWc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuemgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLldnKWJyZWFrO2I9dGhpcy5XZVtjXTt0aGlzLm9mKGIpJiYodGhpcy51ZC5wdXNoKGIpLHRoaXMuemgoYikpfX0sb2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxvczpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPQowO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5vZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLm9mKGEpJiZhLmMoKX0sZnc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJiF0aGlzLlhnKWZvcih0aGlzLldnPSEwLGE9MDthPHRoaXMudWQubGVuZ3RoO2ErKyl0aGlzLnVkW2FdLkFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWRbYV0uQWIpfX19KShjKTt2YXIgJGM9Yy53bXx8JGMsSz1uZXcgJGM7Sy5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2k9dGhpcy5hWzldO3RoaXMuJGw9dGhpcy5hWzEwXTt0aGlzLk1rPXRoaXMuYVsxMF07dGhpcy5UeD10aGlzLmFbMl07dGhpcy5idD10aGlzLmFbOV07dGhpcy5xeD10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsxXX1jLlFtPWI7Yi5wcm90b3R5cGU9CntOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Nazp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMucHgoYSl9LHB4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGFkPWMuUW18fGFkLFNkPW5ldyBhZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLk5pKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnFjKGsuZngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnFjKGsuanUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIFRkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry53YygpO0cuUWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLndjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5RZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cud2MoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLnFnKHdpbmRvdyxHLmd0KCkse2lkOlVkfSl9LDUwMCksbGE9ZS5nYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbNl07dGhpcy5hdT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMucHU9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMubD0KdGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17dGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVrOnRoaXMuJHQoYSl9LCR0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5hdTp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm46dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnB1OnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55czp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLmR1fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucmg9CnRoaXMuY29uZj10aGlzLmViPXRoaXMucGxheWVyPW51bGw7dGhpcy5wZD0wO3RoaXMuVmE9IiI7dGhpcy52ZD1bXTt0aGlzLndkPTA7dGhpcy50aD0hMTt0aGlzLlVlPVtdO2UuZ2IoIm5ld0FkZGVsaXZlcnkiKX1jLnJpPWI7Yi5wcm90b3R5cGU9e052OmZ1bmN0aW9uKGEpe3RoaXMucmg9YX0sQmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlZhPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxJdjpmdW5jdGlvbihhKXt0aGlzLmViPWF9LEh2OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVmFdJiZ0aGlzLmNvbmZbdGhpcy5WYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlZhXVthXSk7cmV0dXJuIGJ9LEJjOmZ1bmN0aW9uKGEsYil7ZS51Yigid2VsdC5kZSIpJiZlLlVhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmh0KCkpdGhpcy5lYi5mKHRoaXMuZWIua2QsdGhpcy5lYi5DYSx0aGlzLmViLlZlLGZ1bmN0aW9uKCl7dGhpcy5CYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIubmMpO2Vsc2UgaWYodGhpcy5HcygpKXRoaXMuR3YoZnVuY3Rpb24oKXt0aGlzLkJjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLncoay4kYyx0aGlzLnBsYXllci52KCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBPKHRoaXMuZ2V0UGxheWVyKCksaCk7YiYmbC5odygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLmdiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBQKGwsdGhpcy5lYixoKTtsLkJoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5idShhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxodDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnBkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMucGQuZ2V0VGltZSgpLHRoaXMucGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnBkPWE7cmV0dXJuITF9LFp2OmZ1bmN0aW9uKCl7ZS5nYigicHJlcm9sbCIpOwplLiRlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGcoYSkpP3RoaXMuQmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX0sWXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuJGUoInBvc3Ryb2xsIik7ZS5nYigicG9zdHJvbGwiKTt0aGlzLk52KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmxnKGMpKT90aGlzLkJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX19LGxnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx4djpmdW5jdGlvbigpe3RoaXMucGxheWVyLlN2KHRoaXMuWXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sRWQ6ZnVuY3Rpb24oYSl7ZS5nYigibWlkcm9sbCIpO2UuJGUoIm1pZHJvbGwiKTtpZighdGhpcy5kaCl7dGhpcy5kaD0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5CYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS53KGsuYWQsdGhpcy5wbGF5ZXIudigpKSl9fSx3djpmdW5jdGlvbigpe3RoaXMucGxheWVyLk12KHRoaXMuRWQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSmUoKX0sYzpmdW5jdGlvbigpe3RoaXMuWnYoKTt0aGlzLnBsYXllci5KZSYmdGhpcy53digpO3RoaXMueHYoKX0seXY6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy52ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3goYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLndkPXRoaXMudmQubGVuZ3RofSxHczpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMud2QmJihhPSEwKTtyZXR1cm4gYX0sR3Y6ZnVuY3Rpb24oYSl7dGhpcy50aD1hO2ZvcihhPTA7YTx0aGlzLnZkLmxlbmd0aDthKyspdGhpcy52ZFthXVsiZnVuY3Rpb24iXSh0aGlzLmN2LmJpbmQodGhpcykpfSxjdjpmdW5jdGlvbihhKXt0aGlzLndkLS07YSYmdGhpcy5VZS5wdXNoKGEpOzA+PXRoaXMud2QmJnRoaXMudGgoKX0sYnU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVWUubGVuZ3RoO2MrKyliPXRoaXMuVWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMucml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzFdO3RoaXMuZXI9dGhpcy5hWzNdO3RoaXMuc2s9dGhpcy5hWzldOwp0aGlzLkdyPXRoaXMuYVszXTt0aGlzLk9wPXRoaXMuYVs3XTt0aGlzLlFxPXRoaXMuYVsyXTt0aGlzLlFrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuY209YjtiLnByb3RvdHlwZT17R286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhvOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2k6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJuOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5lcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2s6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdyOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcDp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXE6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5Razp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNkPWMuY218fGNkLFdkPW5ldyBjZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVdkLkdvKDQpfSkuY2FsbChPb3RhZWxvb3llZWJhWmVlLE9vdGFlbG9veWVlYmFaZWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.32.223.246 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-32-223-246.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Date
Wed, 15 May 2019 15:00:15 GMT
Via
1.1 89934ce37ea0d70a19ace48a847ae306.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
288
Last-Modified
Tue, 30 Apr 2019 15:43:40 GMT
Server
AmazonS3
ETag
"54c7dbe42d2e906013c324c59a35e181"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
9fB5CNoVG3ozMnrxefZTb-OW5-Qjt0fpJSR8wL80_gjDFbwoVfZUGw==
Expires
0
truncated
/ Frame 9ED3
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a07f832083383414f0f5fc8f77c6ba5a01396526ac55f3179060aa25bb9b8297

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
frame
delivery.selfcampaign.com/tag/146005/ Frame 93E7
0
0
Document
General
Full URL
https://delivery.selfcampaign.com/tag/146005/frame?title=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&meta_keywords=&meta_description=Eigentlich%20soll%20das%20Best-of-the-Web-Siegel%20die%20Sicherheit%20von%20Webseiten%20zertifizieren%2C%20stattdesse...
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash

Request headers

Host
delivery.selfcampaign.com
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Server
nginx/1.14.0 (Ubuntu)
Date
Wed, 15 May 2019 15:00:15 GMT
Content-Type
text/html
Content-Length
1477
Connection
keep-alive
ETag
"5cda8ba0-5c5"
fbevents.js
connect.facebook.net/en_US/
53 KB
15 KB
Script
General
Full URL
https://connect.facebook.net/en_US/fbevents.js
Requested by
Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:216:face:b00c:0:3 , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
fa59b1ed1b011e084474ad818b5f6986d84fc678e2f37fee9330eb52d86860b3
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
status
200
vary
Origin, Accept-Encoding
content-length
15397
x-xss-protection
0
pragma
private
x-fb-debug
DZ7yjHxO/xSc92VBPDbT+kgOyUAkzYkkTAESLIqswGl17zpm5GVrBr1q0pt9jbid+sByf6lMtRJaO2d/G6MeEg==
date
Wed, 15 May 2019 15:00:15 GMT
x-frame-options
DENY
access-control-allow-methods
OPTIONS
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
https://connect.facebook.net
access-control-expose-headers
X-FB-Debug, X-Loader-Length
cache-control
private
access-control-allow-credentials
true
expires
Sat, 01 Jan 2000 00:00:00 GMT
/
track2.selfcampaign.com/tag/
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/tag/?request_id=616082e2-bf9b-455d-8089-82c598d34332&_auid=a0e64b983b4194198c0d4cf175d371ed&tag=146005&tags_usergroup=2805&project_id=611&account_id=545&ipzones=&pxs=&_autags=T0T&marked_tags=&lang=en-US&screen=1600x1200&screen_a=1200x1600&color_d=24&location=https%3A//www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&referrer=&location_utm_medium=&location_utm_source=&location_utm_campaign=&location_utm_term=&location_utm_content=&title=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&meta_keywords=&meta_description=Eigentlich%20soll%20das%20Best-of-the-Web-Siegel%20die%20Sicherheit%20von%20Webseiten%20zertifizieren%2C%20stattdesse...
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=a0e64b983b4194198c0d4cf175d371ed
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=a0e64b983b4194198c0d4cf175d371ed
  • https://track.selfcampaign.com/map_td/?tdid=fa19d7f5-3fd6-4805-8b1e-222d3f17164a
  • https://track2.selfcampaign.com/map_td/?tdid=fa19d7f5-3fd6-4805-8b1e-222d3f17164a
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=fa19d7f5-3fd6-4805-8b1e-222d3f17164a
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:17 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Location
https://track2.selfcampaign.com/map_td/?tdid=fa19d7f5-3fd6-4805-8b1e-222d3f17164a
Date
Wed, 15 May 2019 15:00:16 GMT
Server
nginx/1.6.2
Connection
keep-alive
Content-Length
160
Content-Type
text/html
/
track2.selfcampaign.com/map_td/
Redirect Chain
  • https://c1.adform.net/serving/cookie/match?party=1173
  • https://c1.adform.net/serving/cookie/match?CC=1&party=1173
  • https://track2.selfcampaign.com/map_td/?tdid=8239299303467378195&source=adform
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=8239299303467378195&source=adform
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.69.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.69.251.148.clients.your-server.de
Software
nginx/1.9.7 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
Server
nginx/1.9.7
P3P
CP="NOI DSP COR LAW CUR ADM TAI PSA PSD IVA IVD HIS OUR SAM OTR LEG UNI COM NAV DEM CNT LOC"
Cache-Control
post-check=0, pre-check=0
X-CW-LOC
PAGE
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Wed, 15 May 2019 15:00:16 GMT
server
nginx
access-control-allow-origin
*
location
https://track2.selfcampaign.com/map_td/?tdid=8239299303467378195&source=adform
status
302
cache-control
no-cache, no-store, must-revalidate, no-transform
content-length
0
expires
-1
mark
lib.selfcampaign.com/tag/146005/
0
0
Image
General
Full URL
https://lib.selfcampaign.com/tag/146005/mark?t=1557932415
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.131.173 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.173.131.251.148.clients.your-server.de
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

truncated
/ Frame D535
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8b57f4564ee7f6405b8373fc3f700323c895347812eef8a863e465302384b804

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DDp/AAKktFLkqFFlqwF23A52AwwALl1FDK2mFjw3Fw1F0lFLw2FBgw4FBBFLkqFKlkyB23A52AwwA2qoFx1A13A5zAy0AxwA20AxxEzyFy6Em3B3zE1BE/k0FPEmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B04A45A23A24A3xAmhEwkF90A44A52A32A43AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A11A3BELlnFBUkzFYBPrNAAZAwSAcAAAAPBxAAAAAAAB2SRAPIAAFAA2SRTA5iAZGAAOA55A55A85B55A58E55A55AFA3wA4zA4BErA5iASksFhFjAAAAAAAAAAAAEAAA2SRAAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA23A43Ay2Az4ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A23A24A3xADAzrF5BFKA04A45A23A24A3xAKA04A45A23A24A3xAuAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FdAAAAAAAAAAAAFAAAA5iAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFaH3hUA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:14 GMT
/
ssl.2.damoh.golem.de/6e716a77839a200582c6136ca94e291a531f1d1d/
288 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.golem.de/6e716a77839a200582c6136ca94e291a531f1d1d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9vdGFlbG9veWVlYmFaZWU9T290YWVsb295ZWViYVplZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5VYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuQmgobSksYS5GZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5ZcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay4kYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5CZChjKTthLkl2KGwpO2EuSHYobSk7YS55digpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpsPXRoaXMuYVs4XTt0aGlzLmJ4PQp0aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbOV07dGhpcy52bz10aGlzLmFbNl07dGhpcy50bD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLkF1PWI7Yi5wcm90b3R5cGU9e0lsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KbDp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYng6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhwOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkF1fHxrYSxkZD1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1kZC5JbCg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWXA9ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuRGM9W107dGhpcy4kZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJ2LmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5LZz17fX1jLkFrPWI7Yi5wcm90b3R5cGU9e2d3OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rIl8iKTtyZXR1cm4gYX0sZ2I6ZnVuY3Rpb24oYSl7dGhpcy5mYlthXXx8KHRoaXMuZmJbYV09MCk7dGhpcy5mYlthXSs9MTs1PHRoaXMuZmJbYV0mJiF0aGlzLktnW2FdJiYodGhpcy5LZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmd3KCksITApKX0sJGY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sCnNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxidjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5hdihhLmRhdGEpfSxhdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuY2EuZXZlbnRsaXN0ZW5lci5sZW5ndGgsCmQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sWWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sZGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuJGcoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHwKYls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuUnIoYSkpcmV0dXJuOyhiPXRoaXMuZGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxScjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxvZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxPYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHlnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxIaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKVGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx4ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OwowPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0seWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktCmEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoYSl9LmJpbmQodGhpcyksMTAwKX0sd2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxJPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrOwpjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUk7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMTg1OTc3NTM5MyYKNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0k9SStsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihJKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LHBiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJgoxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxtdDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGllOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLAplPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iub2I/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChuKXt9YS5pc1BoYW50b21KUz0KYjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LGFzOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5pZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFFhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGtqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApSczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxYbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5WaSgpfHxhLmtqKCl8fGEuUnMoKXx8YS5tbSgpfHxhLlhuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGhkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxLcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxkdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx0ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVGgoYikrIjoiK3RoaXMuVGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFRoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSwkZTpmdW5jdGlvbihhKXt0aGlzLlBhPWF9LHFnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUGE7dGhpcy5PZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHFjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5xZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZWQpe3ZhciByPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYocj1rLlRhKGEsYikpO2YmJihyPWsuVGEocixmKSk7YyYmKHI9ay5UYShyLGMpKTtoJiYocj1rLlRhKHIsaCkpO2VkJiYocj1rLlRhKHIsaCkpO2UucWMocil9LGR2OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSYmMTAyMyE9YS5jb2RlJiYxMDE4IT1hLmNvZGUpe3RyeXtpZihsYSYmKGIuc2Vzc2lvbl9pZD1sYSksYi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iLGEuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKSxiLmV2ZW50PWEuY29kZSxiLnNpdGVfaHJlZj0KdGhpcy5xcygpLGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH19Y2F0Y2goZCl7fXJldHVybiBifX0sT2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kdihhKTtpZihiKWlmKCFsfHwhbC5iYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwueGQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wud2EoYSwhMCk7YT1sLndhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIjthLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wuSGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5FY3x8KHRoaXMuRWM9e30pO3RoaXMuRWNbZl18fCh0aGlzLkVjW2ZdPTApO3RoaXMuRWNbZl0rKzsxMDx0aGlzLkVjW2ZdfHwoZj1sLnhkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLndhKGYsITApLGY9bC53YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIisKZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxHZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwua3EoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxvZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoPwp0aGlzLmJiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxxZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5qZChhKToiIn0samQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGFxOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuQWUoYSl8fHRoaXMucHQoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5ZZSYmd2luZG93LnNhbmRib3guWWVbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7CmlmKHRoaXMub2coYSkpcmV0dXJuIHRoaXMub2coYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnBiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuVWEoYSxiLkdhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLm5kKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLlJvKGMsYSk7cmV0dXJuIGN9LFVhOmZ1bmN0aW9uKGEsYiwKZCxmLGMsaCxlLHIpe3ZhciBrPWh8fGw7aD0hMDtyJiYoaD0hMSk7aWYoayYmay5iYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2sud2EoYSxoKTtoPWsud2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBrLkhhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYShhLGIsZCxmLGMsayxlLHIpfS5iaW5kKHRoaXMpLDUwMCl9LCRnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciByPSEwO2UmJihyPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHIpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxXdDpmdW5jdGlvbihhLGIsZCl7dGhpcy4kZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5EYylmb3IodmFyIGMgaW4gdGhpcy5EYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxhaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlVhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuV3QoZi5uZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRjPWF9LFd4OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5VYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxNcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sa3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuQWt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93Lm1nPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fAp7fX1jLnprPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuVHU9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuaXU9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSng9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Bcj17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5OZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuSW89e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5peD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnlxPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5hZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLiRjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5MZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuTG89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5PYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVmQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuWGQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLktvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi4kaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLmx1PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IucmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5iZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSXg9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZng9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5qdT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMuemt8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnJvPXRoaXMuYVsyXTt0aGlzLlVxPXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxXTt0aGlzLkFwPXRoaXMuYVs3XTt0aGlzLiRtPXRoaXMuYVs1XTt0aGlzLnN1PXRoaXMuYVs2XTt0aGlzLktqPXRoaXMuYVsyXTt0aGlzLiR1PXRoaXMuYVsxMF07dGhpcy5icD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs3XX1jLnNxPWI7Yi5wcm90b3R5cGU9e3FvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybzp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MdDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXA6dGhpcy5abShhKX0sWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLiRtOnRoaXMucnUoYSl9LHJ1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zdTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktqOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kdTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYT1jLnNxfHxtYSxmZD1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1mZC5xbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkJrPWI7Yi5wcm90b3R5cGU9e3JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxxYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4Iil9LGtzOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGZkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5mZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5mZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LHdjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmUodGhpcy5xYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmZkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxndDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndjKCkrIjIifSxRZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlKHRoaXMua3MoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5mZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMuQmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXE9dGhpcy5hWzRdO3RoaXMucG49dGhpcy5hWzddO3RoaXMuVWo9dGhpcy5hWzZdO3RoaXMua2k9dGhpcy5hWzddO3RoaXMuRnA9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5ndj1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXE6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBuOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmppKGEpfSxqaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2k6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5ndnx8bmEsZ2Q9Cm5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWdkLmNxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/CmYuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51Zj1ifSkoYyk7dmFyIEo9Yy51Znx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVszXX1jLk9xPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIG9hPWMuT3F8fG9hLGhkPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWhkLllqKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Mudm09CkouZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5HPW51bGw7dGhpcy5BYz0xMDA7dGhpcy54Yj0wO3RoaXMuSWE9MTUwO3RoaXMuQWI9MDt0aGlzLkp2KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy54Yjw9dGhpcy5JYT8odGhpcy54YisrLHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpOjA+dGhpcy5JYSYmKHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpfSxBdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhiPnRoaXMuSWE/ITA6ITF9LHpkOmZ1bmN0aW9uKCl7dGhpcy54Yj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sSnY6ZnVuY3Rpb24oYil7dGhpcy5HPWJ9LGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sSzpmdW5jdGlvbihiKXt0aGlzLkphW2IucWIoKV09YjtLJiZLLllnJiZLLmZ3KGIpfSxBeTpmdW5jdGlvbigpe3JldHVybiBlLk9hKHRoaXMuSmEpfSwKSjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9LGx0OmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTnk6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy52bXx8dDsoZnVuY3Rpb24oYyl7Yy54bT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkFjPTEwO3RoaXMueGI9MDt0aGlzLklhPTUwO3RoaXMuTj1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnNiPSIiO3RoaXMuaGc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApnPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt9LFN2OmZ1bmN0aW9uKGIpe3RoaXMuTj1ifSxCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk59LE12OmZ1bmN0aW9uKGIpe3RoaXMuS2U9Yn0senk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sSmU6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLnhiPD10aGlzLklhJiYodGhpcy54YisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuQWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LHhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEFkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sUHk6ZnVuY3Rpb24oKXt9LFY6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSHMoKXx8dGhpcy5PbygpO3RoaXMuQWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKQ3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sT286ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZ2EoMTApKX0sSHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFM6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxIeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxmYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxEZTpmdW5jdGlvbigpe3JldHVybiExfSxDaDpmdW5jdGlvbihiKXt0aGlzLnNiPWJ9LHl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2J9LHhoOmZ1bmN0aW9uKCl7dGhpcy5zYj1udWxsfSxFeTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuc2ImJihiPSEwKTtyZXR1cm4gYn0sSnk6ZnVuY3Rpb24oKXt0aGlzLmhnfHwodGhpcy5oZz0hMCl9LHNjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHZ5OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIG49Yy54bXx8bjsoZnVuY3Rpb24oYyl7Yy5zaT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLkRmPSIxIjt0aGlzLkVmPSIyIjt0aGlzLnlvPSIzIjt0aGlzLkljPTA7dGhpcy5laD0zMDt0aGlzLkZiPVtdO3RoaXMuWmE9W107dGhpcy5iYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5QZj10aGlzLldoPSExO3RoaXMuc3RhdHVzPXRoaXMuSWM7dGhpcy5pZD1lLmdhKDEwKTt0aGlzLkJkKGIpO3RoaXMuS3YoYSl9LGM6ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7dGhpcy5XaHx8KHRoaXMuV2g9ITAsZS5HZSgpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtTJiZTLk1iJiYhcGEmJihwYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sRjpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLlB2KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5QaCgpLHRoaXMuUGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLkZiLnB1c2goYiksdGhpcy5aYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkZiJiYwPHRoaXMuRmIubGVuZ3RoJiYodGhpcy5GYj1lLnVuaXF1ZSh0aGlzLkZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5GYi5qb2luKCIsIikpKTtpZih0aGlzLlphKXtmb3IodmFyIGc9MDtnPHRoaXMuWmEubGVuZ3RoO2crKyl0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXT09dGhpcy5iY1tiXSYmYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSx0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXTwKdGhpcy5iY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSxiPXRoaXMuWmFbZ10ucmVhc29uKTt0aGlzLmJjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LFB2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZn0sUXY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnlvfSxLYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSWN9LEdmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxteTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5FZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuSWN9LEJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPQpifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEt2OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxoczpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LFp0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5zaXx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbD10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbNV07dGhpcy5Uaz10aGlzLmFbMl07dGhpcy5Ebz10aGlzLmFbNF07dGhpcy5QdD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs2XX1jLlhpPWI7Yi5wcm90b3R5cGU9e1VsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WbDp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQmo6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRrOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuRG86dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlB0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5YaXx8cWEsaWQ9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuVWwoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSwKaWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTiYmdGhpcy5OKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5Eanx8VDsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuT2Q9bnVsbDt0aGlzLnJ4PTFFMzt0aGlzLm5oPW51bGw7dGhpcy5Kdz0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub2IpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Kci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuRHMuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5DcyhhLApiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV4KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52eChiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkJzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy53cShhKX0uYmluZCh0aGlzKSl9LHdxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sdXg6ZnVuY3Rpb24oYil7dGhpcy5PZHx8KHRoaXMuT2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd4KGIpfS5iaW5kKHRoaXMpLHRoaXMucngpKX0sd3g6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2QpO3RoaXMuRigpfSx2eDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZCl9LApCczpmdW5jdGlvbihiKXt0aGlzLnN5KGIpO3RoaXMubmg9bmV3IERhdGU7dGhpcy5uaC10aGlzLld1PHRoaXMuSnc/dGhpcy5GKCk6dGhpcy5zKCl9LERzOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuQmQobmV3IFQoYSkpKTt0aGlzLkYoKX0sSnI6ZnVuY3Rpb24oKXt9LENzOmZ1bmN0aW9uKCl7dGhpcy5XdT1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk9hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZywKdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRWp8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rdj10aGlzLmFbNV07dGhpcy5Qcz10aGlzLmFbM107dGhpcy51dT10aGlzLmFbNl07dGhpcy4keD10aGlzLmFbN107dGhpcy5Paz10aGlzLmFbMTBdO3RoaXMucm49dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMl19Yy5Haj1iO2IucHJvdG90eXBlPXtqdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Y6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51dTp0aGlzLlp4KGEpfSxaeDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHg6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9rOgp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1YT1jLkdqfHx1YSxqZD1uZXcgdWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1qZC5qdig0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3RoaXMubmcoKTt0aGlzLnBnKCk7dGhpcy54cT0hMX0sbmc6ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5OYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxwZzpmdW5jdGlvbigpe2lmKCF0aGlzLk5iKXt2YXIgYj0KdGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuTmI9ITApO3RoaXMuVihhKX19LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTiYmKDAsdGhpcy5OKSgpfS5iaW5kKHRoaXMpKX0sSmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5FZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcykpfSxFZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLktlJiYoMCx0aGlzLktlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTsKcmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgdmE9Yy5Za3x8dmE7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTTpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkljO3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMX0sYzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/CmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuV2Q9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmxiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5sYj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5sYj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMubGI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTsKdGhpcy5LYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuZWgmJiF0aGlzLmhhKCkmJih0aGlzLmxiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMuaGEoKSYmKHRoaXMuS2EoKSx0aGlzLmdldFBsYXllcigpLnhxPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5zYjthJiYoYS50ZCgpLGEuZ2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuS2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5laCYmIXRoaXMuaGEoKSYmKHRoaXMubGI/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLk1jLmluZGV4T2YoYSkmJnRoaXMuTWMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5lYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm8oImFkZXJyb3IiLGIuY29kZSksdGhpcy5NYy5sZW5ndGg+PXRoaXMuV2QmJnRoaXMudSgpKX0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5pKCJKVzogIitiLnR5cGUpfSx1OmZ1bmN0aW9uKGIpe2I/dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xOnRoaXMua2U/dGhpcy5rZSsrOnRoaXMua2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSGgoYS52aWRlb1RhZyk/YS5OYj90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLktjfHx0aGlzLmlzUGxheWluZz8odGhpcy5rZT50aGlzLmxlJiYoYj0hMSksdGhpcy5GKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEubmcoKSxhLnBnKCksYS5OYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgd2E9Yy5Ya3x8d2E7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5kcygpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IHZhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5KKGcpfHx0aGlzLmx0KGcpfHwodGhpcy5LKGcpLGc9bmV3IHdhKGcsdGhpcy5HKSxnLk0oKSxnLmMoKSl9fXRoaXMuSSgpfX0seHk6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sZHM6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnBiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB4YT1jLlprfHx4YSx5YT1uZXcgeGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBqPXRoaXMuYVs2XTt0aGlzLkN3PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuSWs9YjtiLnByb3RvdHlwZT17b2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBqOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMuSWt8fHphLGtkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWtkLm9qKDQpOyhmdW5jdGlvbihjKXtjLlpuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTsKdmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLlpufHxBYTsoZnVuY3Rpb24oYyl7Yy5Zbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHwKYi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5Zbnx8QmE7KGZ1bmN0aW9uKGMpe2MuJG49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5PYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPQpiW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IEFhKGcpLHRoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuJG58fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ibj10aGlzLmFbNF07dGhpcy5LdT10aGlzLmFbMV07dGhpcy5Udz10aGlzLmFbOV07dGhpcy54dT10aGlzLmFbNV07dGhpcy5KdD10aGlzLmFbMV07dGhpcy5IdD10aGlzLmFbMl07dGhpcy5CbD10aGlzLmFbOF07dGhpcy5rcD10aGlzLmFbNF07dGhpcy5iaj10aGlzLmFbNF07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVszXX1jLlFzPWI7Yi5wcm90b3R5cGU9e0duOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ibjp0aGlzLkp1KGEpfSwKSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkt1OnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Udzp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh1OnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KdDp0aGlzLkd0KGEpfSxHdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHQ6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJsOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5haihhKX0sYWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJqOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuUXN8fEVhLGxkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5Hbig0KTsoZnVuY3Rpb24oYyl7Yy5Nbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5pYihiKX0uYmluZCh0aGlzKSl9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuTW58fEZhOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucWE9dGhpcy52Yz10aGlzLnhhPXRoaXMuU2M9ITE7dGhpcy51aD1lLndiKDEwKTt0aGlzLlZoPSEwO3RoaXMuZ2M9dGhpcy5OZz0hMTt0aGlzLmloKCk7dGhpcy5ocSgpO3RoaXMuU2EoKX0sS3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLnFiKCksCiI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRGE/Yi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5EYT90eXBlb2YgYi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuRGE/Yi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi5EYT90eXBlb2YgYi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlRkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuVGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuVWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS52YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi52YToidW5kZWZpbmVkWCIsIjsiLGIuUj8KdHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuWmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5yYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudmF9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmMpe3ZhciBiPXRoaXMucmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy52Yz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMudmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy52Y30sanQ6ZnVuY3Rpb24oKXtpZighdGhpcy5NZyl7dmFyIGI9CnRoaXMucmIoKSxhPXRoaXMuaXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk1nPSEwKX1yZXR1cm4gdGhpcy5NZ30saXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5TYz0hMCk7cmV0dXJuIHRoaXMuU2N9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxYZTpmdW5jdGlvbigpe3RoaXMuZ2M9ITA7dmFyIGI9dGhpcy5CZygpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlFhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5oYz0hMDtpZihlLnViKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSx3eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2cmJmIuYWRzJiYodGhpcy5jZz1iLmFkcyk7cmV0dXJuIHRoaXMuY2d9LGhxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLkthKCk7dGhpcy5hYSghMCk7dGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7CnRoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQmcoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksNTApfSxpaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5qdCgpKXt2YXIgYT0KdGhpcy5yYigpLGc9dGhpcy5KYigpO2EmJmcmJih0aGlzLnJiKCksdGhpcy5KYigpLHRoaXMuZ2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nYz90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMucmIoKX1lbHNlIHRoaXMuTmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJiKCksYj10aGlzLkpiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5hYSgpKToodGhpcy5hYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuTmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5paCgpfS5iaW5kKHRoaXMpLDUwKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0saXE6ZnVuY3Rpb24oKXt0aGlzLm1jfHwodGhpcy5tYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMubWMhPWIuYWRzLnN0YXRlJiYodGhpcy5tYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5tYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLm1jPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pcSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXswPD1lLmhkKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlc/dGhpcy51KCEwKToodGhpcy5xYT0hMCx0aGlzLnMoImVtcHR5IHZhc3QiKSl9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwodGhpcy5WaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkYodGhpcy5WaCxmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbnE6ZnVuY3Rpb24oKXt0aGlzLkZ5fHwoMTA8dGhpcy5zeD8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN4KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuenYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnEoKX0uYmluZCh0aGlzKSw1MCkpKX0senY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLnR4KXt0aGlzLnR4PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIEdhPWMuTG58fEdhOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkloKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5JaChiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxJaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS5PYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm1hfHx0aGlzLkooYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuSyhhKSwobmV3IEdhKGEsdGhpcy5HKSkuYygpKSk7cmV0dXJuITB9cmV0dXJuITF9LEk6ZnVuY3Rpb24oKXt0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMuQWMpfX0pfSkoYyk7dmFyIEhhPWMuTm58fEhhLElhPW5ldyBIYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ucj10aGlzLmFbOV07dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VcD10aGlzLmFbNV07dGhpcy5vcD10aGlzLmFbN107dGhpcy5IbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5tcD10aGlzLmFbM107dGhpcy5xcD10aGlzLmFbMV07dGhpcy5Gbz0KdGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNl19Yy5PeD1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubnI6dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KcDp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXA6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vcDp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGw6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldvOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXA6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFwOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7CnZhciBKYT1jLk94fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5tcig0KTsoZnVuY3Rpb24oYyl7Yy5sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7Yi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlMoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0sbGE6ZnVuY3Rpb24oKXt9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLk4mJgoidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLAphPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5sbnx8S2E7KGZ1bmN0aW9uKGMpe2Mua249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuS2I9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWmI9ITE7dGhpcy53aCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT1iLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlpiPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTsKYi5nZXRQbGF5ZXIoKTt0aGlzLlhjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuWWYoKTp0aGlzLnMoKX0sWGM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7YS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuWmI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7CmEuZ2V0UGxheWVyKCk7dGhpcy5aYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMucygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhjLmJpbmQodGhpcyksMTAwKX19LFlmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmCih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LYiksdGhpcy5zKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5LYiYmKHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHwodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkYoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5ZZi5iaW5kKHRoaXMpLDUwKX19LHdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiYKYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlpiPSEwLHRoaXMucygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53aCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmtufHxMYTsoZnVuY3Rpb24oYyl7Yy5tbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmCnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5tbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR5PXRoaXMuYVs0XTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLk1pPXRoaXMuYVs2XTt0aGlzLlNwPXRoaXMuYVsyXTt0aGlzLlNqPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzddfWMuc3I9YjtiLnByb3RvdHlwZT17Y3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5keTp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGk6dGhpcy5MaShhKX0sTGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5NaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3A6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5zcnx8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuY3koNCk7KGZ1bmN0aW9uKGMpe2MuaG49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZWxfO2F8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5lbD9hPWIuZWwoKToiZnVuY3Rpb24iPT10eXBlb2YgYi5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCgpKSkpO3RoaXMuUyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCihiPWJbMF0pO3RoaXMuVihiKX0saWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YSYmYi5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZTIifSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLm11dGVkJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5tdXRlZCYmKGI9YS5tdXRlZCgpKTtyZXR1cm4gYn0sc2M6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5obnx8UGE7KGZ1bmN0aW9uKGMpe2MuZ249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5YZigpO2Iub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5Kb3x8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygidGltZXVwZGF0ZSIpO3RoaXMuRighMCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX0ZJUlNUX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLm8oImFkc2Vycm9yIik7dGhpcy5BcyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LEFzOmZ1bmN0aW9uKGIpe3ZhciBhPTk5OTk5OTtpZihiLmRhdGEmJmIuZGF0YS5BZEVycm9yKWZvcih2YXIgZyBpbiBiLmRhdGEuQWRFcnJvciliLmRhdGEuQWRFcnJvci5oYXNPd25Qcm9wZXJ0eShnKSYmIm51bWJlciI9PXR5cGVvZiBiLmRhdGEuQWRFcnJvcltnXSYmKGE9Yi5kYXRhLkFkRXJyb3JbZ10sdGhpcy5vKGEpKTs5MDE9PWE/dGhpcy5zKCk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PQphPyh0aGlzLlpiPSEwLHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMuSm89ITAsdGhpcy5zKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5YZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz90aGlzLkYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBRYT1jLmdufHxRYTsoZnVuY3Rpb24oYyl7Yy5qbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UmJiJmdW5jdGlvbiI9PQp0eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy56ZCgpLHRoaXMuSSgpfX0pfSkoYyk7dmFyIFJhPWMuam58fFJhLFNhPW5ldyBSYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kaz10aGlzLmFbMV07dGhpcy5FdD10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsxXX1jLkh3PWI7Yi5wcm90b3R5cGU9e2NrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZGs6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgVGE9Yy5Id3x8VGEsb2Q9bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9b2QuY2soNCk7KGZ1bmN0aW9uKGMpe2MuWmk9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5oaD1hfSxNOmZ1bmN0aW9uKCl7fSxIZTpmdW5jdGlvbihiKXt0aGlzLmhoPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmhoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTt0aGlzLlYoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKUDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgVWE9Yy5aaXx8VWE7KGZ1bmN0aW9uKGMpe2MuWWk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxIZTpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZhPWMuWWl8fFZhOyhmdW5jdGlvbihjKXtjLiRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFVhKGQsYSksdGhpcy5KKGQpfHwoZC5IZShhKSx0aGlzLksoZCksCmQ9bmV3IFZhKGQsdGhpcy5HLGcpLGQuSGUoZyksZC5jKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgV2E9Yy4kaXx8V2EsWGE9bmV3IFdhKGlhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbMTBdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMuSm49dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzldO3RoaXMueGk9dGhpcy5hWzldO3RoaXMuT3U9dGhpcy5hWzZdO3RoaXMuRmw9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy50cT1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXA6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5vOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53czp0aGlzLkluKGEpfSwKSW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpuOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vazp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhpOnRoaXMuTnUoYSl9LE51OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PdTp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYT1jLnRxfHxZYSxwZD1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1wZC5QcCg0KTsoZnVuY3Rpb24oYyl7Yy55bD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07CnRoaXMuUyhiKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxRYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBaYT1jLnlsfHxaYTsoZnVuY3Rpb24oYyl7Yy54bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5RYSgpPwooJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5MYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSkpOnRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyICRhPWMueGx8fCRhOyhmdW5jdGlvbihjKXtjLnpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFphKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgJGEoYix0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFiPWMuemx8fGFiLGJiPW5ldyBhYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy50bz10aGlzLmFbM107dGhpcy5Edj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy5ycT1iO2IucHJvdG90eXBlPXtobTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW06dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRvOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Edjp0aGlzLmooYSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLnJxfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5obSg0KTsoZnVuY3Rpb24oYyl7Yy5xbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLlBlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5mYSgpO3JldHVybn10aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlYoYik6dGhpcy5mYSgpfSxYdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnNiLGc9dGhpcy5xYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5NYiYmKDA8PWcuaW5kZXhPZihkKXx8YS50ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUGU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxSYTpmdW5jdGlvbigpe3RoaXMuUGUrKztpZigxMDx0aGlzLlBlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGxhOmZ1bmN0aW9uKCl7fSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLk4mJnRoaXMuTigpfX0pfSkoYyk7dmFyIGRiPWMucW18fGRiOyhmdW5jdGlvbihjKXtjLnBtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHhhOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8Cih0aGlzLnRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMudGIrKywxNTx0aGlzLnRiKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMubmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy55YSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLnhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkhyPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLkhyPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWHUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMucG18fGViOyhmdW5jdGlvbihjKXtjLnJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5ybXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFxPXRoaXMuYVsxXTt0aGlzLmw9dGhpcy5hWzVdfWMubGo9YjtiLnByb3RvdHlwZT17cHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFxOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5sanx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQucHEoNCk7KGZ1bmN0aW9uKGMpe2Mud2s9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5WKGIuZWxlbWVudCl9LFJiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMud2t8fGliOyhmdW5jdGlvbihjKXtjLnZrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PQpiLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCl9fSl9KShjKTt2YXIgamI9Yy52a3x8amI7KGZ1bmN0aW9uKGMpe2MueGs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMueGt8fGtiLGxiPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbz10aGlzLmFbNF07dGhpcy5Gbj10aGlzLmFbNF07dGhpcy5Laz10aGlzLmFbM107dGhpcy56aT10aGlzLmFbMV07CnRoaXMuTnQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMTBdfWMuV2k9YjtiLnByb3RvdHlwZT17Wm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Gbjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5OdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIG1iPWMuV2l8fG1iLHNkPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXNkLlpvKDQpOyhmdW5jdGlvbihjKXtjLlZrPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTt0aGlzLnBoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuUyhnKTt0aGlzLlYoZyk7dGhpcy5kZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kZCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1xOmZ1bmN0aW9uKCl7ZS5UZyh0aGlzLmRkKTtlLnhlKHRoaXMuZGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tcSgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxEZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIG5iPWMuVmt8fG5iOyhmdW5jdGlvbihjKXtjLlVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCEwKX19KX0pKGMpO3ZhciBwYj1jLlVrfHxwYjsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTsKZS5UZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IHBiKGIsdGhpcy5HKSkuYygpKSk7dGhpcy5BYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5BYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcWI9Yy5Xa3x8cWIscmI9bmV3IHFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs5XTt0aGlzLm1sPXRoaXMuYVs3XTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLlRzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuRm09YjtiLnByb3RvdHlwZT17Y3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMucmo6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tbDp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWHI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgc2I9Yy5GbXx8c2IsdGQ9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuY3QoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkNrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEx2OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSwKYil7dGhpcy5kYXRhW2FdPWJ9LFBvOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuQ2t8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5YYT1hO3RoaXMuc2c9dGhpcy5maT0hMTt0aGlzLmpoPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeChhKSk7dmFyIGU9dGhpcy5EYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC5CZSh0aGlzLlhhLnVybCkmJmwuSmQpe3ZhciBoPW5ldyB4KGEudXJsKTsKaC5MdigiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLm5hKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5uYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuRGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuc2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCwKdGhpcy5YYS51cmwsITEpOnRoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy5maXx8KHRoaXMuRGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLkRiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuRGIuc2VuZChhKX1jYXRjaChjKXtsJiZsLkJlKHRoaXMuWGEudXJsKT9sLkpkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuQmUodGhpcy5YYS51cmwpLHRoaXMuamgmJnRoaXMuamgoKX1yZXR1cm4gdGhpcy5EYn19fSkoYyk7dmFyIHRiPWMuRGt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmpjPSIiO3RoaXMuJGQ9dGhpcy5pYz10aGlzLm5iPW51bGw7dGhpcy5McT10aGlzLnliPXRoaXMuWmc9ITE7dGhpcy5HYT0iIjt0aGlzLlZnPSExO3RoaXMuQ2E9CnRoaXMua2Q9IiI7dGhpcy5SZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLkhnPXRoaXMuVGI9IiI7dGhpcy5qZT0hMTt0aGlzLmhmPTA7dGhpcy55Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5FYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVmI9IiI7dGhpcy56Yj1bXTt0aGlzLldiPVtdO3RoaXMuVWI9IiI7dGhpcy5qZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnVlPSExO3RoaXMub3E9dGhpcy5LZD1udWxsO3RoaXMuRmg9dGhpcy5GYz10aGlzLmpnPXRoaXMubmY9dGhpcy5KZD10aGlzLmFlPXRoaXMuSmM9CiExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMubWQ9MDt0aGlzLkpnPSExO3RoaXMuSWc9MUUzfWMuRWs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuc2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5qYyxhZHRhZ21vZGlmaWVyOnRoaXMubmIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmljLGFkdGFncmVnZXg6dGhpcy4kZCxqc3BvcHVwczp0aGlzLlpnLHNpZGVsb2Fkczp0aGlzLnliLGRpc2FibGV0ZXN0czp0aGlzLkxxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuVmcsZ2xvYmFsQ29uZmlnOnRoaXMua2QsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5SZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5UYixob21hZEFkcGF0aDp0aGlzLkhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuamUsCnRlc3RDb29raWVBdHRlbXB0czp0aGlzLmhmLEhPTUFEX1ZFUklGSUVEOnRoaXMueWYsSE9NQURfQkxPQ0tFRDp0aGlzLndmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkViLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy54Zix0ZXN0SGlkZTp0aGlzLlZiLHRlc3RUYWdzOnRoaXMuemIsdGVzdFRhZ3NKUzp0aGlzLldiLHRlc3RDb29raWU6dGhpcy5VYix0aHJvdHRsZTp0aGlzLmpmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMudWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5vcSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5hZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5KZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5TYixzZXJ2ZXJJZDp0aGlzLkFoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5wYywKdnBhaWQ6dGhpcy5GYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuYWl9fSxGczpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LGVzOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLndiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuTXAoYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5zYSYmIWIpcmV0dXJuIG5ldyB4KGEpO2M9dGhpcy5BZShhKTtlPXRoaXMuemEoYSk7Yz8odGhpcy54YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy54ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmpjfHx0aGlzLm5ifHx0aGlzLmljfHx0aGlzLiRkKSYmKGs9dGhpcy5mdShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdzKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5wYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy54YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxCZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkFlKGEpO3JldHVybiBifSxnczpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5yeTtyZXR1cm4ibm9uZSJ9LG5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy5BaF19LHhkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sZmg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sZXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5maChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pOwpCPVtdO2ZvcihsIGluIGMpQi5wdXNoKGwrIj0iK2NbbF0pO2M9Qj1lbmNvZGVVUklDb21wb25lbnQoQi5qb2luKCImIikpfWVsc2UgYz10aGlzLmZoKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9bD1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWwucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sZnU6ZnVuY3Rpb24oYSl7dGhpcy5qYyYmKGErPXRoaXMuamMpO2lmKHRoaXMubmIpZm9yKHZhciBiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5uYltiXSkpO3RoaXMuaWMmJihhPXRoaXMuZXUoYSx0aGlzLmljKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlZnPSEwO3RoaXMua2Q9YTt0aGlzLkNhPWI7dGhpcy5WZT1kO3RoaXMuS2Q9Yzt0aGlzLm5jPWU7dGhpcy5TYj1ofHx7fTt0aGlzLlZ0KCk7aWYoInN0cmluZyI9PQp0eXBlb2YgdGhpcy5DYSl0aGlzLlR0KCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLlljKCl9Y2F0Y2goayl7dGhpcy5uYSgibm9DbGllbnRDb25maWciKX19LGhiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxWdDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5rZCt0aGlzLlFjKCJnbG9iYWwiKSksdGhpcy56cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLlljKCl9LmJpbmQodGhpcyksITApfSxUdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5RYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLlFjKCJjbGllbnQiKSksdGhpcy5ZYy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuWmUoImNsaWVudCIpO3RoaXMubmEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFFjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLndiKCk7dGhpcy5TYiYmdGhpcy5TYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuU2ImJnRoaXMuU2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5uYz0hMSk7dGhpcy5uYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm5jPwp0aGlzLm5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmJhPXRoaXMuUmc9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMud2YpKTt0aGlzLkJiKCk7ZS5xYyhrLlR1KTsoYj1lLmhkKHRoaXMubmQoKSkpfHwoYj1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx6czpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5UYnx8dGhpcy5HYXx8dGhpcy5ZYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKSwKdGhpcy5CYigpKX19LFljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuQ2F9ZWxzZSBhPXRoaXMuQ2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihhLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlRiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5IZz1hLmFkcGF0aHx8IiI7dGhpcy5qZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkFoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVGImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoPwp0aGlzLnFkKCExKToodGhpcy5zYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5CYigpKX0scWQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB4KHRoaXMueGQoKSksZD10aGlzLnphKHRoaXMuVGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5UYit0aGlzLlFjKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5sdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiY3VzdG9tZXIiKTthP3RoaXMuUG0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5QbT0hMCwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxsdzpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe310aGlzLkpkPXRoaXMuWGIoYi5zdHJpY3QpO3RoaXMubmY9dGhpcy5YYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5qZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucGM9dGhpcy5YYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuWGIoYi5lbmFibGVkKTt0aGlzLlZiPWIudGVzdGhpZGV8fCIiO3RoaXMuemI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLldiPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuamM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1iLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuaWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLiRkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlpnPWIuanNwb3B1cHN8fCExO3RoaXMueWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuRmM9Yi52cGFpZHx8ITE7dGhpcy5TYi52cGFpZD10aGlzLkZjO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5WYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYWk9Yi52bWFwc3x8IiI7dGhpcy5VYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBzKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5qZSYmKHRoaXMuVWI9bnVsbCk7dGhpcy5qZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnVlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy51ZT0hMCx0aGlzLnFkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLkl3KCkmJgoodGhpcy5WYnx8dGhpcy5XYnx8dGhpcy56Ynx8dGhpcy5VYik/dGhpcy5WZT8odGhpcy5zYT10aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5lZSgpLHRoaXMuQmIoKSk6dGhpcy5ydygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN3KCkpfX0scnc6ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy50dygpfSx0dzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLndpZHRoPTE7Yy5oZWlnaHQ9MTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3JjPSJhYm91dDpibGFuayI7dmFyIGg9ZS5nYSgxMCksQj1lLmdhKDEwKSxrPWUuZ2EoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGssZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmEoQikrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UucGIoYShoKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChsKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2lmKDMhPWQpe3ZhciBhPWUuaWUoKTshYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5RYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKTt0aGlzLkJiKCl9LElkOmZ1bmN0aW9uKGEpe3RoaXMuSmM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9CnRoaXMuc2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKGEpKSx0aGlzLkJiKCksdGhpcy5lZSgpKX0scXc6ZnVuY3Rpb24oKXtpZih0aGlzLlZiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlZiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuVmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuTmgoKX1lbHNlIHRoaXMuTmgoKX0sCk1oOmZ1bmN0aW9uKCl7dmFyIGM7dmFyIGQ7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpO3RoaXMud3coYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmVmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5JZCh0aGlzLkhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9dGhpcy56Yj1udWxsLHRoaXMuZWYoKX0sd3c6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpOwp0aGlzLnh3KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5NaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5XYiYmdGhpcy5XYi5sZW5ndGgpe3ZhciBjPXRoaXMuV2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSx4dzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LGVmOmZ1bmN0aW9uKCl7dGhpcy5VYj8odGhpcy5oZisrLHRoaXMuSGEobmV3IHgodGhpcy5VYiksdGhpcy5wdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuSWQodGhpcy54ZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmhmP3RoaXMuZWYoKTp0aGlzLmZmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuS2goKTp0aGlzLmZmKCJBQUEiKX0sS2g6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSk7dGhpcy5CYigpO3RoaXMuZWUoKX0sQmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuUWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5KYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMueWYpKTt0aGlzLktkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuS2QmJnRoaXMuS2QoKX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLm5mJiZ0aGlzLkZzKCkpe3ZhciBhPXRoaXMuZXMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFBoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsYixjLGYsaCxCKXt0aGlzLm1kfHwodGhpcy5tZD0wKTt0aGlzLm1kKys7dGhpcy5tZD50aGlzLklnJiYhdGhpcy5KZyYmKHRoaXMuSmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLklnLCEwKSk7YT1uZXcgdGIoYSxiLGMpO2YmJihhLmZpPSEwKTtoJiZlLm10KCkmJihhLnNnPSEwKTtCJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxWZjpmdW5jdGlvbigpe2UuUWEoKXx8ZS5VYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubmEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMueGMoKXx8KGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTsKaC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxvdzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5haX0sa3E6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5oeC5iaW5kKHRoaXMpLAp0aGlzLmd4LmJpbmQodGhpcykpfSxoeDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuQ3IoKX0sZ3g6ZnVuY3Rpb24oKXt9LENyOmZ1bmN0aW9uKCl7ZS5xYyhrLkJyKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLm5hKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxlZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnliLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMueWIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy55YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBSO3dpbmRvd1tjLndjKCldPXRoaXM7ZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLmpmfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sd2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFhiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLHAsbix2LHUsdztwPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHgucHVzaChlKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PAoyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKHA+Pj4yOSk7eC5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO3A9bDtuPW07dj1xO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl3PWMoZSw1KSsocCZufH5wJnYpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStuJjQyOTQ5NjcyOTU7cT1xK3YmNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciB1Yj1jLkVrfHx1YixsPW5ldyB1Yjt3aW5kb3cudWc9bDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adz10aGlzLmFbNF07dGhpcy5XbT10aGlzLmFbMl07dGhpcy5LaT10aGlzLmFbMV07dGhpcy5jdz10aGlzLmFbMl07dGhpcy5rbD10aGlzLmFbNF07dGhpcy5zdD10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbN107CnRoaXMuVnI9dGhpcy5hWzddO3RoaXMuWW09dGhpcy5hWzNdO3RoaXMuWnE9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMl19Yy53bz1iO2IucHJvdG90eXBlPXtZdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnc6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LaTp0aGlzLmJ3KGEpfSxidzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3c6dGhpcy5qbChhKX0samw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtsOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdDp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Wcjp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlltOnRoaXMuWXEoYSl9LApZcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWnE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB2Yj1jLndvfHx2Yix1ZD1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT11ZC5Zdyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLm0uUD90aGlzLlZhPWEubS5QKCk6dGhpcy5WYT0iIjthLm0uUGcmJmEubS5QZyh7cGF1c2U6dGhpcy50ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLkxlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuJHcuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5hYjt0aGlzLnBsYXllcj10aGlzLmIubTt0aGlzLkhiPXRoaXMuVGM9ITE7dGhpcy5LcD0xRTM7dGhpcy5qYT0KbnVsbDt0aGlzLlQ9Yjt0aGlzLnVhPXt9O3RoaXMudmlkZW89e307dGhpcy5HZD17fTtlLmdiKCJuZXdCaWdBZElkIik7dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmJmPTA7dGhpcy5SYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlJjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlJjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuRmQ9ITE7dGhpcy5iaD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuUGM9ITE7dGhpcy5TaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLk1iPSExO3RoaXMuenE9CmUuZ2EoMTApO3RoaXMuUGI9ZS5nYSgxMCk7dGhpcy5PYj1lLmdhKDEwKTt0aGlzLkdoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm9jPXRoaXMudmI9ITE7dGhpcy5tZT1udWxsO3RoaXMuTmQ9dGhpcy5DYj10aGlzLndlPXRoaXMuU2U9dGhpcy5mZT10aGlzLmJkPXRoaXMuZGY9dGhpcy5hYz10aGlzLlBkPXRoaXMubGg9dGhpcy5lZD10aGlzLkt3PXRoaXMua2I9ITE7dGhpcy5lYz1bXTt0aGlzLlliPXt9O3RoaXMua2Y9ITF9Yy55az1iO2IucHJvdG90eXBlPXtCaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pO3JldHVybiBifSxRaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5QYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULkpjP2UudHJhY2soImFkY2FsbCIsIjEiKToKZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay5Mbyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxGZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5rYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmJmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5ULmxxKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLlFoKCksbmV3IFUodGhpcyxhLHRoaXMuYmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5GYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5RaCgpLG5ldyBVKHRoaXMsYSx0aGlzLmJoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULkZjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLAprZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLk1hKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkZlKGEsYixjKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7dGhpcy5OZD10aGlzLkNiPXRoaXMuZWQ9ITE7dGhpcy5nPWE7dGhpcy5Udih0aGlzLmcpO3RoaXMuRWcoYSk7dGhpcy5lYz10aGlzLnZnKGEpO3RoaXMuWWI9e307dGhpcy5rZj0hMX0sRWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5zcyhhKSksdGhpcy5FZyhhLnBhcmVudCkpfSx2ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMudmcoYS5wYXJlbnQpKSwKYy5wdXNoKHRoaXMuJHIoYSkpKTtyZXR1cm4gY30sJHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHNzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlguZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuY2QmJmEuY2QuZXJyb3ImJmEuY2QuZXJyb3IuY29kZSYmKGI9YS5jZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LkdjLmNvZGU6Yj09RC5SZC5jb2RlP2UudyhrLkp4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpOihlLkdlKCksYj09RC5CZi5jb2RlJiZlLncoay5odSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Bcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuemYuY29kZTplLncoay5peCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQ2YuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5OeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS53KGsuUngsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7CmJyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudyhrLml1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMub2N8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkliKGEpO3RoaXMuTWEoKX0sSWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkxhLmxlbmd0aDspdHJ5e3ZhciBjPWEuTGEucG9wKCk7dGhpcy5FZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sVHY6ZnVuY3Rpb24oYSl7dGhpcy5mZT0KdGhpcy53ZT10aGlzLlNlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7dGhpcy5VbyYmdGhpcy5wbGF5ZXIuc2MoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnNjKCkvCjEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuUW8oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLk9oKGIpPyh0aGlzLlNvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy51cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLlJ2KCkpOnRoaXMuemUoKT90aGlzLkRoKCk6dGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0sUnY6ZnVuY3Rpb24oKXt0aGlzLmFjPXRoaXMuUGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuYWM9ITApO2UuJGYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4udGYmJmUuVG8odGhpcy5nLm9yaWdpbi50Zik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCxhKTt0aGlzLmIubWgoKTt0aGlzLmIuQ2MoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYi5DYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLnBmKCJ2cGFpZCIpO3RoaXMuYWMmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTsKdGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnVzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmFxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5ZZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkxiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmVjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMueHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYKKHRoaXMueXgoKSx0aGlzLmIuTGIoITApLCF0aGlzLkNiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLk5kPSEwO2UudyhrLiRoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnllKHRoaXMuQ2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5MYighMCksdGhpcy5DeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuTGIoITApLAp0aGlzLkd4KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSHgoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuYmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcubGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuYWcsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7CmEuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkJ4KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnp4KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLkF4KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5hYz0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5yZCwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYWM9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5tZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuWWQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSk7ZS5ZZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcykpO3RoaXMuYi5ObyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHp4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLlBkPSEwfSxBeDpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLlBkPSExfSxDeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEJ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHl4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuWWEoImltcHJlc3Npb24iKTtlLncoay5IZiwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sR3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sRXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEZ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLkpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5OZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxEeDpmdW5jdGlvbigpe3RoaXMuTGQoKTtlLllhKCJjb21wbGV0ZSIpfSwKYmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5NYShhKX19LHh4OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudyhrLkl4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7CnRoaXMuYmkoITApfSxRbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnhjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy5veC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sU286ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdGhpcy5NZC5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk1kLmJpbmQodGhpcykpfSxaaDpmdW5jdGlvbihhKXt0aGlzLkhifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGJ8fHRoaXMucWYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxxZjpmdW5jdGlvbihhKXtpZighdGhpcy5UYyYmdGhpcy5PaCh0aGlzLnZpZGVvKSYmIXRoaXMudmImJiF0aGlzLkhiKXt0aGlzLlRjPQohMDt0cnl7aWYoIWUuUWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudmJ8fCh0aGlzLnZiPSEwLHRoaXMueWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmpnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5NYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLm54KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQ2MoKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMuUmYoKTt0aGlzLmIubWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuY2YoKX19LGNmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmQpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJgooYT1hKGUuUGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMubGQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmxkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuTmMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTmMoKX1lbHNlIHRoaXMuTmMoKX0sTmM6ZnVuY3Rpb24oYSl7aWYodGhpcy5sZClmb3IodmFyIGI9MDtiPHRoaXMubGQubGVuZ3RoO2IrKyl0aGlzLmxkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmJkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5NYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkxlKCEwKSx0aGlzLk5jKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLndlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5TZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlFiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuUWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUWIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLlBjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5jZigpKX0uYmluZCh0aGlzKTt0aGlzLnBlKCkuQ2godGhpcyl9LExkOmZ1bmN0aW9uKCl7dGhpcy5ULnBjJiYhdGhpcy52YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLklvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5NYSgpfSxNYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSlpZih0aGlzLmZlPSEwLHRoaXMuTmR8fChlLncoay5sdSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5qYnx8dGhpcy5nLmNjKXtlLmdiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmJmKys7dGhpcy5IYj10aGlzLlRjPSExO3RyeXt0aGlzLnlkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5GZD0hMTt0cnl7dGhpcy5iLlVoKCl9Y2F0Y2goaCl7fXRoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5NYj0hMTt0aGlzLnBlKCkueGgoKTsKdGhpcy5nLmpiJiZ0aGlzLmcub3JpZ2luLk1lKCk7dGhpcy5nLmNjJiYoYT90aGlzLmcub3JpZ2luLmdoKCk6dGhpcy5nZSgpKX1lbHNlIHRoaXMuZ2UoKX0sb3g6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy55ZCh0aGlzLnZpZGVvKSx0aGlzLnplKCk/dGhpcy5EaCgpOnRoaXMuTWQoYSkpfSxNZDpmdW5jdGlvbihhKXt0aGlzLkhiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnplKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9jfHx0aGlzLlQuVmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZigpKTsKdGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0scmY6ZnVuY3Rpb24oKXtpZih0aGlzLkt3KXRoaXMuTWEoKTtlbHNle3RoaXMuTWI9ITA7dGhpcy5iLm0uUmEmJiF0aGlzLmRmJiZ0aGlzLmIubS5SYSgpJiZlLncoay4kYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5QdyhhKTtpZighdGhpcy5DYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5OZD0hMDtlLncoay4kaCx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UueWUodGhpcy5DYil9Yz0iIjt0aGlzLmcuYWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGM9dGhpcy5nLmFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkZkfHwodGhpcy5GZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5MZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5qYj8odGhpcy5IYj10aGlzLlRjPSExLHRoaXMueWQodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRmQ9ITEsdGhpcy5iLlVoKCksdGhpcy5nLm9yaWdpbi5NZSgpKTp0aGlzLk1hKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlJjLnJlcGxhY2UoIlt0aW1lXSIsZS50Zyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLlBjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMub2M9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkNjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlloLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMubWU9c2V0SW50ZXJ2YWwodGhpcy5qcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG5zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgueGMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LGpxOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5tZSksdGhpcy5MZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnJmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm1lKSx0aGlzLk1kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFJoOmZ1bmN0aW9uKCl7dGhpcy5saHx8KHRoaXMubGg9ITAsdGhpcy5lZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFB3OmZ1bmN0aW9uKGEpe2UudyhrLlhkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5TaHx8dGhpcy52Ynx8KDA9PWEmJih0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKSx0aGlzLlNlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLndlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlJoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5IZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5vYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULnBjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5lZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk5mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuU2g9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudmIpe3RyeXtpZih0aGlzLlliW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuWWIuaW1wcmVzc2lvbiYmdGhpcy5ZYi5jb21wbGV0ZSYmIXRoaXMua2Ype3RoaXMua2Y9ITA7dmFyIGM9dGhpcy5ZYi5jb21wbGV0ZS0KdGhpcy5ZYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmKDEwPmMmJihjPTEwKSwwPmMmJihjPSJuZWdhdGl2ZSIpLGUudHJhY2soZixjLCEwKSl9fWNhdGNoKGgpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9Yz1bXTt0cnl7Yz10aGlzLnRzKHRoaXMuZy5MYSxhKX1jYXRjaChsKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgbT1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5HZC5pbXByZXNzaW9ucyYmZS5rdChtLnVybCx0aGlzLkdkLmltcHJlc3Npb25zKT90aGlzLkVlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5Lbyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHthZElkOnRoaXMuR2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuRCgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKG0udXJsLG0udHlwZSl9Y2F0Y2gocil7fWlmKCFiKXRyeXt0aGlzLmcuTGE9dGhpcy5GcSh0aGlzLmcuTGEsYSl9Y2F0Y2gobil7fX19LEVlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuVC53YShhKSxjJiZhLlBvKGMpLGZ8fChmPXRoaXMuaWcpLHRoaXMuVC5IYShhLGYsdGhpcy5pZywhMSwhMCkpfSx0czpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LEZxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LG54OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLlloLmJpbmQodGhpcyl9LApZaDpmdW5jdGlvbigpe2UudyhrLmFnLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLmVkJiZlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLmFzKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5zYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5nLmxjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMuZy5sYyx0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKX19LmJpbmQodGhpcyksMjAwKX0sWGg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPQp0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuUmMucmVwbGFjZSgiW3RpbWVdIixlLnRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlQuVmMmJihiPXRoaXMuVC5WYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy50Yy5iaW5kKHRoaXMpLDFFMyoKYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSx0YzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy56cTt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5EZCgpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnVjKCk7dGhpcy50YygpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5QYjtjLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Pdy5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk53LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRGQoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy51YygpO3RoaXMudGMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLk9iO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTXcuYmluZCh0aGlzKSk6Zi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mdy5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2guaWQ9dGhpcy5HaDtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2guaW5uZXJIVE1MPSIiO2IuYXBwZW5kQ2hpbGQoYyk7dGhpcy5nLmFmJiZiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoZik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpOwp0aGlzLmNvbnRyb2xzPXRoaXMuamEuYXBwZW5kQ2hpbGQoYik7InZwYWlkIiE9YSYmdGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuTGUoKSk7dGhpcy51YygpfX0sdWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxEZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxOdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYi5ILnBhdXNlZD8odGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsCiEwKSxlLncoay5WZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT3c6ZnVuY3Rpb24oKXt0aGlzLlBkP2Uub2EodGhpcy5PLCJjb250cm9sIiwicGxheSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwicGF1c2UiKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmIuSC5wYXVzZWR8fCh0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5iLkgucGF1c2VkJiYodGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKSl9LEx3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWQ/KHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYi5ILm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudyhrLnJkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxNdzpmdW5jdGlvbigpe3RoaXMuYWM/ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJ1bm11dGUiKTplLm9hKHRoaXMuTywiY29udHJvbCIsIm11dGUiKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWR8fCh0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5yZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sJHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKTt0aGlzLmIuSC5tdXRlZCYmKHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LFFiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLAp0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5RYik7dGhpcy5iZHx8dGhpcy5QY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuY2YoKSl9LGdlOmZ1bmN0aW9uKCl7dGhpcy5iZD0hMDt0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKTtpZigoInByZXJvbGwiPT1lLlBhJiZ0aGlzLlBjfHwicG9zdHJvbGwiPT1lLlBhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlBhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkw7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5DYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwpjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5oZSgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLmhlKCl9ZWxzZSB0aGlzLmhlKCl9LApoZTpmdW5jdGlvbigpe3RoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5iLkJ2KCk7dGhpcy5NYj0hMTtlLncoay55cSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMucGUoKS54aCgpfSxwZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIubSYmKGE9dGhpcy5iLm0pO3JldHVybiBhfSx6ZTpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFJmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUueGUodGhpcy52aWRlbywKYSk/dGhpcy55aCgpOnRoaXMudGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuZy5sYyxhLmR1cmF0aW9uPXRoaXMuZy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuZy5qYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLmVjJiYwPHRoaXMuZWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLmVjKSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlhwKyItIit0aGlzLmJmO3RoaXMuZyYmdGhpcy5nLnpnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuZy56ZygpKTtyZXR1cm4gYX0saWc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBQPWMueWt8fFA7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5sPXRoaXMuYVsxXTt0aGlzLkJvPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVs5XTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLnp1PXRoaXMuYVs5XTt0aGlzLlFyPXRoaXMuYVszXTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzVdfWMua3U9YjtiLnByb3RvdHlwZT17TWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk5sOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Cbzp0aGlzLmZtKGEpfSxmbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ206dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhxOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56dTp0aGlzLlByKGEpfSxQcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXI6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5Mczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB3Yj1jLmt1fHx3Yix2ZD1uZXcgd2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT12ZC5NbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkJhPW51bGw7dGhpcy5aPVtdO3RoaXMuWD1udWxsO3RoaXMuZGM9dGhpcy5mYz0hMTt0aGlzLnRmPSIiO3RoaXMuc2Y9ITE7ZCYmZC5lbXB0eT90aGlzLll0KCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MuS249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmllKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHgodGhpcy51cmwpOmwud2EobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlFhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZXx8Yyl7YT1lLmRnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC53YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLndhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSJ9bC5IYShiLHRoaXMuWHQuYmluZCh0aGlzKSx0aGlzLlV0LmJpbmQodGhpcykpfSx3ZzpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuQmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlBhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChkKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGYpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5QYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUGF8fHRoaXMub3QoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwub3coKSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sb3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxYdDpmdW5jdGlvbihhKXt0aGlzLnJ2KGEpO3RyeXt0aGlzLkJhPWEucmVzcG9uc2VYTUwsdGhpcy5CYXx8KHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5OYSh3LlNkKSl9dGhpcy5aPXRoaXMud2coKTt0aGlzLmZjPXRoaXMuZ2YoKTt0aGlzLmRjPXRoaXMuTGgoKTt0aGlzLloubGVuZ3RoP3RoaXMuemMoKTp0aGlzLnJhKHRoaXMuTmEody5HYyx7ZXJyb3I6dGhpcy5zZj9ELlJkOkQuQWZ9KSl9LFl0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwKKHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk5hKHcuU2QpKX10aGlzLlo9dGhpcy53ZygpO3RoaXMuZmM9dGhpcy5nZigpO3RoaXMuZGM9dGhpcy5MaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy56YygpOnRoaXMucmEodGhpcy5OYSh3LkdjLHtlcnJvcjp0aGlzLnNmP0QuUmQ6RC5BZn0pKX0sVXQ6ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuTmEody56Zix7ZGVwdGg6YX0pKX0semM6ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5aLnNoaWZ0KCk7dGhpcy5xdCgpP3RoaXMueXcoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5GZygpLGcse0FkU3lzdGVtOnRoaXMuWnIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5yYSh0aGlzLk5hKHcuQ2YpKTooYT0wLHRoaXMuZXgoKSYmdGhpcy5RZSh0aGlzLkFxKCkpKX0sTWU6ZnVuY3Rpb24oKXt0aGlzLmZjPyh0aGlzLmZjPTE8dGhpcy5aLmxlbmd0aCwKdGhpcy5aLmxlbmd0aCYmdGhpcy56YygpKTp0aGlzLnBhcmVudC5NZSgpfSxnaDpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMuZGM9MTx0aGlzLloubGVuZ3RoLHRoaXMuWi5sZW5ndGgmJnRoaXMuemMoKSk6dGhpcy5wYXJlbnQuZ2goKX0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52dygpP3RoaXMudXcoKT8hMDooLTEhPXRoaXMucmMoKT90aGlzLnJhKHRoaXMuTmEody52ZikpOnRoaXMucmEodGhpcy5OYSh3LnpqKSksITEpOih0aGlzLnJhKHRoaXMuTmEody5HYyxELkJmKSksITEpfSxRZTpmdW5jdGlvbihhKXthLkxhPWEuTGEuY29uY2F0KHRoaXMuSWUoKSk7YS5qYj1hLmpiP2EuamI6dGhpcy5mYzthLmNjPWEuY2M/YS5jYzp0aGlzLmRjO3RoaXMucGFyZW50LlFlKGEpfSxBcTpmdW5jdGlvbigpe3ZhciBhPW5ldyB4YjthLmR1cmF0aW9uPXRoaXMucmMoKTthLlU9dGhpcy5DZygpO2EubGM9dGhpcy5icygpO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuWXIoKTthLmFmPXRoaXMucnMoYS5kdXJhdGlvbik7CnJldHVybiBhfSxyYTpmdW5jdGlvbihiKXt0aGlzLlgmJihiLkxhPWIuZXJyb3IuY29kZSE9dy52Zi5jb2RlP2IuTGEuY29uY2F0KHRoaXMuY3MoKSk6Yi5MYS5jb25jYXQodGhpcy5scygpKSk7dGhpcy5aLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkliJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuSWImJnRoaXMucGFyZW50LkliKGIpLGE9MCx0aGlzLnpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYiksYT0wKX0sSWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuSWIoYSl9LGtnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLk5hKGEsYikpfSxOYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB5YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LHl3OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sdnc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkNnKCkubGVuZ3RofSwKdXc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnJjKCl9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sTGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlomJjI8PXRoaXMuWi5sZW5ndGgmJiF0aGlzLmdmKCkmJihhPSEwKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxxdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LEZnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJBZFN5c3RlbSIpfSxJZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLlNnKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmJiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5TZyhhLnBhcmVudE5vZGUpOiExfSxsczpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LENnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksVWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHR5OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLAp1cmw6dGhpcy5iYihhW2NdKX0pO3RyeXt2YXIgZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksYj1kLmNvbmNhdChnKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz0KYj10aGlzLmpkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxyYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmJiKHRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scnM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5kdyhkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJgoib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmpkKGEpOiIifSxqZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5Lbnx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meT10aGlzLmFbNl07dGhpcy5acz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtleTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmZ5OnRoaXMuWXMoYSl9LFlzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5aczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMudml8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLmV5KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5VPVtdO3RoaXMubGM9IiI7dGhpcy5CPXRoaXMuY2M9dGhpcy5qYj0hMTt0aGlzLnRlPXRoaXMub3JpZ2luPW51bGx9Yy51bT1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxqczpmdW5jdGlvbigpe2lmKCF0aGlzLnRlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSwKYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnRlPWFbY10pfXJldHVybiB0aGlzLnRlfSx6ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5qcygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx1czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMudW18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVs0XTt0aGlzLldwPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzRdfWMuVnE9YjtiLnByb3RvdHlwZT17UGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFqOnRoaXMuVnAoYSl9LFZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XcDoKdGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYj1jLlZxfHxBYix4ZD1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT14ZC5Qaig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LHpqOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxHYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnRhOiJFTVBUWV9WQVNUIn0sQ2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHpmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp0YToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIix0YToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LGp5Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHRhOiJNRURJQUZJTEVfRVJST1IifSx2Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17QWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sbHk6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHRhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVnU9dGhpcy5hWzldO3RoaXMucWs9dGhpcy5hWzNdO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlF4PXRoaXMuYVs2XTt0aGlzLkF0PXRoaXMuYVsyXTt0aGlzLlBuPXRoaXMuYVsyXTt0aGlzLlhzPXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVszXTt0aGlzLm92PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzhdfWMuZ3k9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZ1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xazoKdGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuUHgoYSl9LFB4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ReDp0aGlzLnp0KGEpfSx6dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXQ6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBuOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Yczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm92OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgQmI9Yy5neXx8QmIseWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9eWQuVXUoNCk7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuY2Q9Yjt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Yaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHliPWMuWGp8fHliO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ5PXRoaXMuYVs1XTt0aGlzLlZ3PXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzldfWMudHQ9YjtiLnByb3RvdHlwZT17YXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ5OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIENiPWMudHR8fENiLHpkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT16ZC5heSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLm09YTt0aGlzLmFiPWEueGcoKTt0aGlzLkw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5MLmlkPWUuZ2EoMTApO3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkE9e307dGhpcy5iZT0hMTt0aGlzLm9iPVtdfWMuRmo9YjtiLnByb3RvdHlwZT17dWc6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxmPTAsYj0wLGU9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9Yi5sZWZ0LGI9Yi50b3ApO2U9e3g6ZiwKeTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudWcoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk5zKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYKKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodzpmdW5jdGlvbigpe3RoaXMuYmU9ITB9LFVoOmZ1bmN0aW9uKCl7dGhpcy5IPUMucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkguaWQ9ImFkWGRpc3BsYXkiLHRoaXMuSC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxtaDpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLiRjLHRoaXMubS52KCkpfSxCdjpmdW5jdGlvbigpe3RoaXMuYmV8fCh0aGlzLm0ucGxheSgpLGUudyhrLmFkLHRoaXMubS52KCkpKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMubS5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0KImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5MLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5MLnN0eWxlLmJveFNpemluZz10aGlzLmFiLnN0eWxlLmJveFNpemluZzt0aGlzLkwuc3R5bGUud2lkdGg9dGhpcy5hYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmFiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5hYik7dGhpcy5tLlJiJiZ0aGlzLm0uUmIoKT90aGlzLm0ueGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMubS5leGl0RnVsbHNjcmVlbigpfSwKTnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG1nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZyh0aGlzLmFiKTtpZihiLnghPXRoaXMuQS54fHxiLnkhPXRoaXMuQS55fHxiLnBvc2l0aW9uIT10aGlzLkEucG9zaXRpb258fGIud2lkdGghPXRoaXMuQS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuQS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5BLndpZHRoJiYKMDx0aGlzLkEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZSgpO3JldHVybn10aGlzLkE9Yjt0aGlzLm0uUmIoKT8odGhpcy5MLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5MLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuTC5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9iLmxlbmd0aDthKyspdGhpcy5vYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkhoKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTGIuYmluZCh0aGlzKSwxMCl9LE5vOmZ1bmN0aW9uKGEpe3RoaXMub2J8fAoodGhpcy5vYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMub2IucHVzaChhKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLkwmJnRoaXMuTC5wYXJlbnROb2RlJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5MKTt0aGlzLkgmJnRoaXMuSC5wYXVzZSYmdGhpcy5ILnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLkZqfHxPLEM9W10sRGI9MDsxMDA+RGI7RGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUuZ2EoMTApO0wuY29udHJvbHM9ITA7Qy5wdXNoKEwpfXZhciBIPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCnopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlN1PXRoaXMuYVsxXTt0aGlzLlh2PXRoaXMuYVs3XTt0aGlzLmdxPXRoaXMuYVs3XTt0aGlzLmVwPXRoaXMuYVsxXTt0aGlzLmZrPXRoaXMuYVs2XTt0aGlzLkV3PXRoaXMuYVs3XTt0aGlzLnF2PXRoaXMuYVs1XTt0aGlzLk1qPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuTXM9YjtiLnByb3RvdHlwZT17UnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlN1OnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mazp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkV3OnRoaXMucHYoYSl9LHB2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xdjp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYj1jLk1zfHxFYixBZD1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1BZC5SdSg0KTsoZnVuY3Rpb24oYyl7Yy5rbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWQoYik7CnRoaXMuZ2coKX0sQWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuRmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBGYj1jLmttfHxGYjsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkdiPXRoaXMuR2J8fCExO3RoaXMuSWY9dGhpcy5LZj10aGlzLk9nPXRoaXMucWE9dGhpcy5sZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcihhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubGY9ITA7dGhpcy5PZyYmdGhpcy5aZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnNiO2EmJmEuTWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5XYygpO3RoaXMuT2c9ITA7dGhpcy5aZigpfS5iaW5kKHRoaXMpKTt0aGlzLlRmKCl9LFpmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2Ipe3RoaXMuV2MoKTtpZighdGhpcy5sZiYmIXRoaXMuV2MoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5sZiYmdGhpcy5JZiYmIXRoaXMuS2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxXYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sRGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sVGY6ZnVuY3Rpb24oKXtpZih0aGlzLldjKCkpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5LZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLklmPWIucXl9dGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRmKCl9LmJpbmQodGhpcyksMTAwKX0sdXk6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuR3koKTohMX0scmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnJjKCk6LTF9LG1zOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElyOmZ1bmN0aW9uKGIsYSl7dGhpcy5HYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkdifHwzMDI9PXRoaXMuR2I/dGhpcy5xYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuR2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT8odGhpcy5zKCksdGhpcy5lYSgpKTpiLm9kKCk/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXMoYik/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgR2I9Yy5qbXx8R2I7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxudDpmdW5jdGlvbigpe3dpbmRvdy5PTy5DbS56by54bz93aW5kb3cuT08uQ20uem8ueG8ub3koZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuT2EoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEZiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBHYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgSGI9Yy5sbXx8SGIsSWI9bmV3IEhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml5PXRoaXMuYVszXTt0aGlzLlRsPXRoaXMuYVs2XTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLmdyPXRoaXMuYVs2XTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzddfWMuR2k9YjtiLnByb3RvdHlwZT17aHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml5OnRoaXMuU2woYSl9LApTbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGw6dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncjp0aGlzLmhyKGEpfSxocjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaXI6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYj1jLkdpfHxKYixCZD1uZXcgSmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1CZC5oeSg0KTsoZnVuY3Rpb24oYyl7Yy5paj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuR2coKX0sR2c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmCihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKbGE6ZnVuY3Rpb24oKXt0aGlzLnNoKCl9LHNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5OJiYoMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgS2I9Yy5panx8S2I7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sVWY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy5zKCJlbXB0eSIpLHRoaXMuZWEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5lYSgpOnRoaXMudSgpKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuVWYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5oanx8TGI7KGZ1bmN0aW9uKGMpe2Muamo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8CihiLkFkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLksoYiksKG5ldyBMYihiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLktyfHwodGhpcy5Lcj0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMudmgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5qanx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkV1PXRoaXMuYVsxXTt0aGlzLnRuPXRoaXMuYVs5XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs4XTt0aGlzLmt4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVs5XX1jLkJwPWI7Yi5wcm90b3R5cGU9e0R1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudG46dGhpcy5WaihhKX0sVmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xajp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTXI6dGhpcy5qeChhKX0sang6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5CcHx8TmIsQ2Q9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPUNkLkR1KDQpOyhmdW5jdGlvbihjKXtjLmVuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7CnZhciBXPWMuZW58fFc7KGZ1bmN0aW9uKGMpe2MuZG49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5RZigiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuUWYoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5xdShhKX0uYmluZCh0aGlzKSk7eS5FcygpfSxxdTpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLnMoKTt0aGlzLmVhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPwohMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBYPWMuZG58fFg7KGZ1bmN0aW9uKGMpe2MuZm49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuc2QmJihiPWUuS3EoYix0aGlzLnNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFcoZCk7CmlmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuc2R8fCh0aGlzLnNkPVtdKSx0aGlzLnNkLnB1c2goYlthXSksZD1uZXcgVyhoKSx0aGlzLkooZCl8fCh0aGlzLksoZCksZj1uZXcgWChkLHRoaXMuRyksZi5jKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxRZjpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSx6dzpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYKIXRoaXMuZGFbYV0pdGhpcy55Y3x8KHRoaXMueWM9W10pLHRoaXMueWMucHVzaChiKSx0aGlzLkF2KCkmJih0aGlzLnpkKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEVzOmZ1bmN0aW9uKCl7aWYodGhpcy55Yylmb3IodmFyIGI9MDtiPHRoaXMueWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy55Y1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmRhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5kYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lnp3KGIpfX0pfSkoYyk7dmFyIE9iPWMuZm58fE9iLHk9bmV3IE9iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWs9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzhdO3RoaXMuU209dGhpcy5hWzFdO3RoaXMuZnY9dGhpcy5hWzFdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuRXI9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzddO3RoaXMuVWk9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtsazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWs6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hdzp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZ2OnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydzp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU3E6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVyOnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5SdDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYj1jLnNqfHxQYixEZD1uZXcgUGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KRGQubGsoNCk7KGZ1bmN0aW9uKGMpe2MuZWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLmVqfHxRYjsoZnVuY3Rpb24oYyl7Yy5maj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMucygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUmI9Yy5manx8UmI7KGZ1bmN0aW9uKGMpe2MuZ2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgUWIoZCk7dGhpcy5KKGUpfHwodGhpcy5LKGUpLChuZXcgUmIoZSx0aGlzLkcpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5nanx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRpPXRoaXMuYVsyXTt0aGlzLnVwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzJdfWMuanI9YjtiLnByb3RvdHlwZT17Q2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYj1jLmpyfHxVYixFZD1uZXcgVWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1FZC5DaSg0KTsoZnVuY3Rpb24oYyl7Yy5YbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlMoYik7dGhpcy5WKGEpO3RoaXMudHYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdHY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiYKdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFBnOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIFZiPWMuWGx8fFZiOyhmdW5jdGlvbihjKXtjLldsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5laT0hMX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5laSYmKHRoaXMuRigpLHRoaXMuZWk9ITAsdGhpcy5LYSgpKTthLkZhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRigpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBXYj1jLldsfHxXYjsoZnVuY3Rpb24oYyl7Yy5ZbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBWYihiW2RdKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBXYihjLHRoaXMuRykpLmMoKSl9fWVsc2UgdGhpcy5JKCl9fSl9KShjKTt2YXIgWGI9Yy5ZbHx8WGIsWT1uZXcgWGIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWo9dGhpcy5hWzZdO3RoaXMueXA9dGhpcy5hWzJdO3RoaXMuQ3E9dGhpcy5hWzddO3RoaXMua2s9dGhpcy5hWzFdO3RoaXMuQm09dGhpcy5hWzhdO3RoaXMuWXg9dGhpcy5hWzVdO3RoaXMueWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuRnQ9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklqOnRoaXMueHAoYSl9LAp4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuQnEoYSl9LEJxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DcTp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua2s6dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJtOnRoaXMuWHgoYSl9LFh4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ZeDp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYj1jLkZ0fHxZYixGZD1uZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1GZC5Iaig0KTsoZnVuY3Rpb24oYyl7Yy5Sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgWmI9Yy5Sbnx8WmI7KGZ1bmN0aW9uKGMpe2MuUW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sSmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5XYXx8KHRoaXMuV2E9W10pO3RoaXMuV2EucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5lYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLmdjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxjOmZ1bmN0aW9uKCl7dGhpcy51KCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnhhP3RoaXMuc3YodGhpcy54YSk6KHRoaXMueGE9dGhpcy5KYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCkpfSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnhhKXt0aGlzLkYoKTtyZXR1cm59aWYoIXRoaXMuZ2Mpe3RoaXMuRigpO3JldHVybn1iPSEwO2lmKHRoaXMuV2EmJgp0aGlzLldhLmxlbmd0aCYmMTx0aGlzLldhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuV2EubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuV2FbYV0mJjMwMyE9dGhpcy5XYVthXSYmNDAzIT10aGlzLldhW2FdJiYoYj0hMSk7aWYoYil0aGlzLnMoImVtcHR5IiksdGhpcy5lYSgpO2Vsc2V7dGhpcy5GKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgJGI9Yy5Rbnx8JGI7KGZ1bmN0aW9uKGMpe2MuU249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5JYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBaYihiLml0ZW0oYSkpO3RoaXMuSihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSyhjKSwKKG5ldyAkYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgYWM9Yy5Tbnx8YWMsYmM9bmV3IGFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl1PXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs2XTt0aGlzLkN0PXRoaXMuYVsxMF07dGhpcy5wcj10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuYXI9dGhpcy5hWzFdO3RoaXMuaXY9dGhpcy5hWzldO3RoaXMudXI9dGhpcy5hWzZdO3RoaXMuZ3A9dGhpcy5hWzZdO3RoaXMucnI9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudXQ9YjtiLnByb3RvdHlwZT17SHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkl1OnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HdTp0aGlzLkJ0KGEpfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Q6dGhpcy5vcihhKX0sCm9yOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wcjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFyOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pdjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXI6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdwOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNjPWMudXR8fGNjLEdkPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUdkLkh1KDQpOyhmdW5jdGlvbihjKXtjLmJsPQpuLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTiYmKDAsdGhpcy5OKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBkYz0KYy5ibHx8ZGM7KGZ1bmN0aW9uKGMpe2MuYWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5yZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NbygpfS5iaW5kKHRoaXMpKSx0aGlzLmRpPSExLHRoaXMuS3g9MUUzLAp0aGlzLm9oPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxyZzpmdW5jdGlvbigpe3RoaXMub2guZG9uZXx8KHRoaXMub2guZG9uZT0hMCx0aGlzLmRpPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jaSgpfS5iaW5kKHRoaXMpLHRoaXMuS3gpKX0sTW86ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGkpO3RoaXMucygpfSxjaTpmdW5jdGlvbigpe3RoaXMueWEoKT8odGhpcy5zKCksdGhpcy5lYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRigpKX0sQWc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5BZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLkFnKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBlYz1jLmFsfHxlYzsoZnVuY3Rpb24oYyl7Yy5jbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuT2Eod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGRjKGMpLHRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IGVjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGZjPWMuY2x8fGZjLGdjPW5ldyBmYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW49dGhpcy5hWzhdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMuTXg9dGhpcy5hWzddO3RoaXMucmw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudnU9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbTp0aGlzLkx4KGEpfSxMeDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXg6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgaGM9Yy52dXx8aGMsSGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLlRuKDQpOyhmdW5jdGlvbihjKXtjLmJuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBpYz1jLmJufHxpYzsoZnVuY3Rpb24oYyl7Yy5hbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMua2MoKX0sa2M6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5DZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2MoKX0uYmluZCh0aGlzKSwxMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LAp1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5hbnx8amM7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBpYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgamMoYiwKdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLmNufHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbOV19Yy5paT1iO2IucHJvdG90eXBlPXtPbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmlpfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5PbCg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuUmU9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLll1KCl9LmJpbmQodGhpcyksNTAwKX0sWXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuUmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuUmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxldzpmdW5jdGlvbigpe3RoaXMuUmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLk5tfHxuYzsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuJGI9MH0sYzpmdW5jdGlvbigpe3RoaXMuY3U9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy4kYnx8KHRoaXMuJGI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy4kYnx8dGhpcy4kYisrLHRoaXMuJGI8PXRoaXMuY3U/KHRoaXMuJGIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmV3KCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgb2M9Yy5NbXx8b2M7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBwYz1jLk9tfHxwYyxxYz1uZXcgcGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHA9dGhpcy5hWzhdO3RoaXMuV249dGhpcy5hWzhdOwp0aGlzLm14PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLmR4PXRoaXMuYVs2XTt0aGlzLmZ0PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLnl0PXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMubnc9YjtiLnByb3RvdHlwZT17Q3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Xbjp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubXg6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFpOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5keDp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRyOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgcmM9Yy5ud3x8cmMsSmQ9bmV3IHJjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9SmQuQ3AoNCk7KGZ1bmN0aW9uKGMpe2MuS209bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLk4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgc2M9Yy5LbXx8c2M7KGZ1bmN0aW9uKGMpe2MuSm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7CmEmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuS2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52cSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmdkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5TdCgpOnRoaXMua2MoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSx2cTpmdW5jdGlvbigpe3RoaXMuR2YoKXx8dGhpcy51KCEwKX0sU3Q6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZCgpOyFiLnZhJiZiLlomJmIubnkmJmIucHkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfSxrYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtjKCl9LmJpbmQodGhpcyksMTAwKX0sZ2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5raClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKS5pZCwKYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLmtoPWJbY10pO3JldHVybiB0aGlzLmtofSxDZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSx1OmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5nZCgpLmFkc0xvYWRlcj90aGlzLkYoITApOnRoaXMuRigpOnRoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB0Yz1jLkptfHx0YzsoZnVuY3Rpb24oYyl7Yy5MbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBzYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IHRjKGMsdGhpcy5HKSkuYygpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIHVjPWMuTG18fHVjLHZjPW5ldyB1YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbM107dGhpcy5oaT10aGlzLmFbMTBdO3RoaXMuWW89dGhpcy5hWzEwXTt0aGlzLlF1PXRoaXMuYVsxMF07dGhpcy53dD10aGlzLmFbNV07dGhpcy5IbT10aGlzLmFbN107dGhpcy5NdT10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsyXX1jLkF3PWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWk6dGhpcy5naShhKX0sZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhpOnRoaXMuWG8oYSl9LApYbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWW86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlF1OnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53dDp0aGlzLkdtKGEpfSxHbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSG06dGhpcy5MdShhKX0sTHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5NdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHdjPWMuQXd8fHdjLEtkPW5ldyB3YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUtkLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKRSYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuVihhKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYjpmdW5jdGlvbigpe3JldHVybiEwfSxGYTpmdW5jdGlvbigpe3ZhciBiO0U/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFo9Yy52bHx8WjsoZnVuY3Rpb24oYyl7Yy51bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5UZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlRlPWIuaWQpO0U/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlRlJiZiIT10aGlzLlRlfHwiYWRlcnJvciIhPWEuZXZlbnR8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm8oImFkZXJyb3IiLGEuSXkpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYWE9Yy51bHx8YWE7KGZ1bmN0aW9uKGMpe2Mud2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihFKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFooYiksYi5tYXx8dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBaKGIpLGIubWE/dGhpcy56ZCgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEUseGM9Yy53bHx8eGMseWM9bmV3IHhjKGZ1bmN0aW9uKGMsYil7Yy5wYXVzZSgpO2lmKGwueWIubGVuZ3RoKXt2YXIgYT1sLnliLnNoaWZ0KCk7CmlmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9ZS5Pdih7IltMT0FEU0NSSVBUXSI6ZS5nYSgxMCksIltVVElMU10iOmUuZ2EoMTApLCJbQ0FMTEJBQ0tdIjplLmdhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS5haC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuYWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHEoYyxiKX1lbHNlIHEoYyxiKX0pO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ4PXRoaXMuYVs4XTt0aGlzLlJ3PXRoaXMuYVs4XTt0aGlzLmt3PQp0aGlzLmFbMl07dGhpcy5lbz10aGlzLmFbNV07dGhpcy50bT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs5XX1jLlJrPWI7Yi5wcm90b3R5cGU9e1V4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WeDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnc6dGhpcy5pdyhhKX0saXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmt3OnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lbzp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudG06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yz1jLlJrfHx6YyxMZD1uZXcgemMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1MZC5VeCg0KTsoZnVuY3Rpb24oYyl7Yy54bj0Kbi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlYoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmd1PWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxPeTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiYKYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuTiYmdGhpcy5OKCkpfX0pfSkoYyk7dmFyIE09Yy54bnx8TTsoZnVuY3Rpb24oYyl7Yy53bj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8KHRoaXMudGI9MCksdGhpcy50YisrLDE1PHRoaXMudGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuUXYoKToKdGhpcy51KCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5uZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTj1jLndufHxOOyhmdW5jdGlvbihjKXtjLnluPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSkpO3RoaXMuemQoKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnlufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHI9CnRoaXMuYVsxMF07dGhpcy5FcT10aGlzLmFbN107dGhpcy5uaj10aGlzLmFbMl07dGhpcy53aj10aGlzLmFbNF07dGhpcy51aj10aGlzLmFbMV07dGhpcy53cD10aGlzLmFbNl07dGhpcy5CaT10aGlzLmFbMTBdO3RoaXMubXY9dGhpcy5hWzddO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMV19Yy5Gaz1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHI6dGhpcy5EcShhKX0sRHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5FcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmo6dGhpcy52aihhKX0sdmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53ajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndwOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CaToKdGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5MbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIENjPWMuRmt8fENjLE1kPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU1kLmtyKDQpOyhmdW5jdGlvbihjKXtjLm9sPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmVnPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuZmEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVnfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTj8oMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7YnE6ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5lZz1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7YnE6ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpOwp2YXIgRGM9Yy5vbHx8RGM7KGZ1bmN0aW9uKGMpe2Mubmw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTXk6ZnVuY3Rpb24oKXt9LHZ2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWYobmV3IGZ1bmN0aW9uKCl7fSk7YS5reT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi52dihhKTt3aW5kb3cuYmU9Yn0sYzpmdW5jdGlvbigpe3RoaXMudXZ8fCh0aGlzLnV2PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmV8fCh0aGlzLnZlPTEpO2lmKDIwPHRoaXMudmUpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmCihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuU2EoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy52ZSsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTApfX0sU2E6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLm8oImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlkoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LAp1OmZ1bmN0aW9uKGIpe3RoaXMuRihiKX19KX0pKGMpO3ZhciBFYz1jLm5sfHxFYzsoZnVuY3Rpb24oYyl7Yy5wbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgRGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLm1hfHx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBFYyhjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRmM9Yy5wbHx8RmMsR2M9bmV3IEZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Iaz10aGlzLmFbNF07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5SbD10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy4kcz1iO2IucHJvdG90eXBlPXtHazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGs6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZzOnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pajp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUmw6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy4kc3x8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPU5kLkdrKDQpOyhmdW5jdGlvbihjKXtjLmZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuZmx8fGJhOyhmdW5jdGlvbihjKXtjLmRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLkxnPTA7dGhpcy5XPXRoaXMuV3x8ITE7CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnZjPXRoaXMueGE9dGhpcy5TYz0hMTt0aGlzLnVoPWUud2IoMTApO3RoaXMuVWcoKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlNhKCksITA7dGhpcy5MZysrO2lmKDEwPHRoaXMuTGcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5VZy5iaW5kKHRoaXMpLDEwMCksITF9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52YTtpZihiKXt2YXIgYT0iYWRFcnJvciIsCmM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApOwp0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmCmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGNhPWMuZGx8fGNhOyhmdW5jdGlvbihjKXtjLmdsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBJYz1jLmdsfHxJYyxKYz0KbmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk9yPXRoaXMuYVsyXTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnpuPWI7Yi5wcm90b3R5cGU9e05yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Pcjp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBLYz1jLnpufHxLYyxPZD1uZXcgS2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1PZC5Ocig0KTsoZnVuY3Rpb24oYyl7Yy5haz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIExjPWMuYWt8fExjOyhmdW5jdGlvbihjKXtjLiRqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLAp0aGlzLnUoKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIE1jPWMuJGp8fE1jOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLk9hKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgTGMoZCksZC5tYXx8dGhpcy5KKGQpfHwodGhpcy5LKGQpLChuZXcgTWMoZCx0aGlzLkcpKS5jKCkpOwplbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5jPWMuYmt8fE5jLE9jPW5ldyBOYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbOV07dGhpcy5Hdz10aGlzLmFbNl07dGhpcy5udT10aGlzLmFbOF07dGhpcy5Gdj10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbNF07dGhpcy5GaT10aGlzLmFbNV07dGhpcy5kaj10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbMl07dGhpcy5YcT10aGlzLmFbNF07dGhpcy5pbD10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLnhyPWI7Yi5wcm90b3R5cGU9e0NsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EbDp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3c6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm51OnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuRnY6dGhpcy5icihhKX0sYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZGo6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpzOnRoaXMuV3EoYSl9LFdxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5YcTp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYz1jLnhyfHxQYyxQZD1uZXcgUGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1QZC5DbCg0KTsoZnVuY3Rpb24oYyl7Yy5oaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5WKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgUWM9Yy5oa3x8UWM7KGZ1bmN0aW9uKGMpe2MuZ2s9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuV2YoKX0sV2Y6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldmKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgUmM9Yy5na3x8UmM7KGZ1bmN0aW9uKGMpe2MuaWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFFjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSihiKSl7dGhpcy5LKGIpOyhuZXcgUmMoYix0aGlzLkcpKS5jKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBTYz1jLmlrfHxTYyxUYz1uZXcgU2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnE9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLnVpPQp0aGlzLmFbNF07dGhpcy53cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs1XX1jLiRrPWI7Yi5wcm90b3R5cGU9e01xOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnE6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLiRrfHxVYyxRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5NcSg0KTsoZnVuY3Rpb24oYyl7Yy5taT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTsKYj8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLmZhKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIFZjPWMubWl8fFZjOyhmdW5jdGlvbihjKXtjLmxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuY2UoKTt0aGlzLlNmKCl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMDt0aGlzLnMoImVtcHR5IHZhc3QiKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlNmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5jZS5iaW5kKHRoaXMpLDEwMCl9LGNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKInBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2EuYmluZCh0aGlzKSwxMCksdGhpcy5zKCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy51KCk6dGhpcy51KCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNlLmJpbmQodGhpcyksMTAwKX19LHU6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5LYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMubGl8fFdjOyhmdW5jdGlvbihjKXtjLm5pPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuSSgpfX0pfSkoYyk7dmFyIFhjPWMubml8fFhjLFljPW5ldyBYYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obz10aGlzLmFbNF07dGhpcy5vbT10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbOV07dGhpcy5lbT10aGlzLmFbNV07dGhpcy5FbT10aGlzLmFbOF07dGhpcy5Ebj10aGlzLmFbM107dGhpcy4kcD10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkltPWI7Yi5wcm90b3R5cGU9e2ZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaG86dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5vbTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnE6dGhpcy5kbShhKX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVtOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FbTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG46dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgWmM9Yy5JbXx8WmMsUmQ9bmV3IFpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UmQuZm8oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuV2c9dGhpcy5ZZz10aGlzLlhnPSExO3RoaXMudWQ9W107dGhpcy5XZT0Ke0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdmM/bnVsbDp2YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBCYz9udWxsOkJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeWM/bnVsbDp5YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgT2M/bnVsbDpPYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHFjP251bGw6cWMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJiP251bGw6cmIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhPwpudWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT9udWxsOll9fWMud209YjtiLnByb3RvdHlwZT17YzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5vcyhhKTpbXSxiO3RoaXMuWWc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuemgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLldnKWJyZWFrO2I9dGhpcy5XZVtjXTt0aGlzLm9mKGIpJiYodGhpcy51ZC5wdXNoKGIpLHRoaXMuemgoYikpfX0sb2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxvczpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPQowO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5vZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLm9mKGEpJiZhLmMoKX0sZnc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJiF0aGlzLlhnKWZvcih0aGlzLldnPSEwLGE9MDthPHRoaXMudWQubGVuZ3RoO2ErKyl0aGlzLnVkW2FdLkFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWRbYV0uQWIpfX19KShjKTt2YXIgJGM9Yy53bXx8JGMsSz1uZXcgJGM7Sy5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2k9dGhpcy5hWzldO3RoaXMuJGw9dGhpcy5hWzEwXTt0aGlzLk1rPXRoaXMuYVsxMF07dGhpcy5UeD10aGlzLmFbMl07dGhpcy5idD10aGlzLmFbOV07dGhpcy5xeD10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsxXX1jLlFtPWI7Yi5wcm90b3R5cGU9CntOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Nazp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMucHgoYSl9LHB4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGFkPWMuUW18fGFkLFNkPW5ldyBhZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLk5pKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnFjKGsuZngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnFjKGsuanUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIFRkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry53YygpO0cuUWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLndjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5RZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cud2MoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLnFnKHdpbmRvdyxHLmd0KCkse2lkOlVkfSl9LDUwMCksbGE9ZS5nYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbNl07dGhpcy5hdT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMucHU9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMubD0KdGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17dGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVrOnRoaXMuJHQoYSl9LCR0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5hdTp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm46dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnB1OnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55czp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLmR1fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucmg9CnRoaXMuY29uZj10aGlzLmViPXRoaXMucGxheWVyPW51bGw7dGhpcy5wZD0wO3RoaXMuVmE9IiI7dGhpcy52ZD1bXTt0aGlzLndkPTA7dGhpcy50aD0hMTt0aGlzLlVlPVtdO2UuZ2IoIm5ld0FkZGVsaXZlcnkiKX1jLnJpPWI7Yi5wcm90b3R5cGU9e052OmZ1bmN0aW9uKGEpe3RoaXMucmg9YX0sQmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlZhPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxJdjpmdW5jdGlvbihhKXt0aGlzLmViPWF9LEh2OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVmFdJiZ0aGlzLmNvbmZbdGhpcy5WYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlZhXVthXSk7cmV0dXJuIGJ9LEJjOmZ1bmN0aW9uKGEsYil7ZS51Yigid2VsdC5kZSIpJiZlLlVhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmh0KCkpdGhpcy5lYi5mKHRoaXMuZWIua2QsdGhpcy5lYi5DYSx0aGlzLmViLlZlLGZ1bmN0aW9uKCl7dGhpcy5CYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIubmMpO2Vsc2UgaWYodGhpcy5HcygpKXRoaXMuR3YoZnVuY3Rpb24oKXt0aGlzLkJjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLncoay4kYyx0aGlzLnBsYXllci52KCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBPKHRoaXMuZ2V0UGxheWVyKCksaCk7YiYmbC5odygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLmdiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBQKGwsdGhpcy5lYixoKTtsLkJoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5idShhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxodDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnBkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMucGQuZ2V0VGltZSgpLHRoaXMucGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnBkPWE7cmV0dXJuITF9LFp2OmZ1bmN0aW9uKCl7ZS5nYigicHJlcm9sbCIpOwplLiRlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGcoYSkpP3RoaXMuQmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX0sWXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuJGUoInBvc3Ryb2xsIik7ZS5nYigicG9zdHJvbGwiKTt0aGlzLk52KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmxnKGMpKT90aGlzLkJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX19LGxnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx4djpmdW5jdGlvbigpe3RoaXMucGxheWVyLlN2KHRoaXMuWXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sRWQ6ZnVuY3Rpb24oYSl7ZS5nYigibWlkcm9sbCIpO2UuJGUoIm1pZHJvbGwiKTtpZighdGhpcy5kaCl7dGhpcy5kaD0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5CYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS53KGsuYWQsdGhpcy5wbGF5ZXIudigpKSl9fSx3djpmdW5jdGlvbigpe3RoaXMucGxheWVyLk12KHRoaXMuRWQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSmUoKX0sYzpmdW5jdGlvbigpe3RoaXMuWnYoKTt0aGlzLnBsYXllci5KZSYmdGhpcy53digpO3RoaXMueHYoKX0seXY6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy52ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3goYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLndkPXRoaXMudmQubGVuZ3RofSxHczpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMud2QmJihhPSEwKTtyZXR1cm4gYX0sR3Y6ZnVuY3Rpb24oYSl7dGhpcy50aD1hO2ZvcihhPTA7YTx0aGlzLnZkLmxlbmd0aDthKyspdGhpcy52ZFthXVsiZnVuY3Rpb24iXSh0aGlzLmN2LmJpbmQodGhpcykpfSxjdjpmdW5jdGlvbihhKXt0aGlzLndkLS07YSYmdGhpcy5VZS5wdXNoKGEpOzA+PXRoaXMud2QmJnRoaXMudGgoKX0sYnU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVWUubGVuZ3RoO2MrKyliPXRoaXMuVWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMucml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzFdO3RoaXMuZXI9dGhpcy5hWzNdO3RoaXMuc2s9dGhpcy5hWzldOwp0aGlzLkdyPXRoaXMuYVszXTt0aGlzLk9wPXRoaXMuYVs3XTt0aGlzLlFxPXRoaXMuYVsyXTt0aGlzLlFrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuY209YjtiLnByb3RvdHlwZT17R286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhvOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2k6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJuOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5lcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2s6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdyOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcDp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXE6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5Razp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNkPWMuY218fGNkLFdkPW5ldyBjZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVdkLkdvKDQpfSkuY2FsbChPb3RhZWxvb3llZWJhWmVlLE9vdGFlbG9veWVlYmFaZWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
78.46.21.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.37.21.46.78.clients.your-server.de
Software
AmazonS3 /
Resource Hash
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 15 May 2019 15:00:15 GMT
Connection
keep-alive
Content-Length
288
Last-Modified
Tue, 30 Apr 2019 15:43:41 GMT
Server
AmazonS3
Etag
"54c7dbe42d2e906013c324c59a35e181"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de5-homad-2
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DElEBA/k0FjImvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B04A45A23A24A3xAmhEwkF90A44A52A32A43AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A11A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BihFuuFlyFmhEwjF90A44A53A53A45A2mAhwFk9B04A45A35A34A52AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A2yAzBELlnFCUkzFnBPuAAAAAAAABX6eAPAAAFAAX6eThRjAZHAAOA55A55A85B55A58E55A55AGAxyA22Ax1ArhRjAPfBAAAAAAAIA5iAPBAAAAAAAAIhRjASksFqFjAAAAAAAAAAAAEAAAX6eAAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEMAxzA4yA23A13A4wA0wANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A35A34A52AGAihFuuFlyFKA04A45A35A34A52AKA04A45A35A34A52AxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGiFhuFulFyBFdAAAAAAAAAAAAFAAAhRjAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjF7ipXWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:14 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DFmEBA/k0F+MmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B04A45A23A24A3xAmhEwkF90A44A52A32A43AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A11A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BihFuuFlyFmhEwjF90A44A53A53A45A2mAhwFk9B04A45A35A34A52AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A2yAzmEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFmhEwjF90A44A52A4wA30A0mAhwFk9B04A45A24Aw3A00AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A35AzyA0xA15Aw2ALlnFDTkzFePUDAAAAAAAB7PsAPBAAFAA7PsTZyOASksF5EjAAAAAAAAAAAAEAAA7PsAAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAxBEMAxzA4yA23A43Ay2A12ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A24Aw3A00AJAylFj0FhuFnsFlBFKA04A45A24Aw3A00AKA04A45A24Aw3A00A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFQtjFNDQqYA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:15 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:14 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DGcFBATkzFrZHAAOA55A55A85B55A58E55A55AGAx4AxyA0zArZyOARksF6dAAAAAAAAAAAAFAAAZyOAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjF2/LPSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:15 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DHcFBA/k0FgRmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B04A45A23A24A3xAmhEwkF90A44A52A32A43AxmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A11A3mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BihFuuFlyFmhEwjF90A44A53A53A45A2mAhwFk9B04A45A35A34A52AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A13A5zAy0Ax1A2yAzmEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFmhEwjF90A44A52A4wA30A0mAhwFk9B04A45A24Aw3A00AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A35AzyA0xA15Aw2AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A35AzyA0xA15A42ATkzFARksFAQtjF3rLkZA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:15 GMT
bridge3.304.0_de.html
imasdk.googleapis.com/js/core/ Frame 1FCE
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.304.0_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.304.0_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
183567
date
Mon, 13 May 2019 19:23:50 GMT
expires
Tue, 12 May 2020 19:23:50 GMT
last-modified
Mon, 13 May 2019 19:20:55 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
156986
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
client.js
s0.2mdn.net/instream/video/
26 KB
10 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10523
x-xss-protection
0
expires
Wed, 15 May 2019 15:00:16 GMT
413343732388253
connect.facebook.net/signals/config/
207 KB
55 KB
Script
General
Full URL
https://connect.facebook.net/signals/config/413343732388253?v=2.8.47&r=stable
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:216:face:b00c:0:3 , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
d645956646bc0e6e1a33190fce79233b95079081e906891293f343a7c98492bc
Security Headers
Name Value
Content-Security-Policy default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self';
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
status
200
vary
Origin, Accept-Encoding
content-length
56215
x-xss-protection
0
pragma
public
x-fb-debug
YUhdzQEtmmBWKjjEga/FAcO+Dt4LPU7WYTDVYDdzy82w+PqJXTuITA24hWct/J/Cds/T5GZWJvNthRIDegytuw==
date
Wed, 15 May 2019 15:00:16 GMT
x-frame-options
DENY
access-control-allow-methods
OPTIONS
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
https://connect.facebook.net
access-control-expose-headers
X-FB-Debug, X-Loader-Length
cache-control
public, max-age=1200
access-control-allow-credentials
true
content-security-policy
default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self';
expires
Sat, 01 Jan 2000 00:00:00 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9vdGFlbG9veWVlYmFaZWU9T290YWVsb295ZWViYVplZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5VYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuQmgobSksYS5GZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5ZcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay4kYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5CZChjKTthLkl2KGwpO2EuSHYobSk7YS55digpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpsPXRoaXMuYVs4XTt0aGlzLmJ4PQp0aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbOV07dGhpcy52bz10aGlzLmFbNl07dGhpcy50bD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLkF1PWI7Yi5wcm90b3R5cGU9e0lsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KbDp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYng6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhwOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkF1fHxrYSxkZD1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1kZC5JbCg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWXA9ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuRGM9W107dGhpcy4kZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJ2LmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5LZz17fX1jLkFrPWI7Yi5wcm90b3R5cGU9e2d3OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rIl8iKTtyZXR1cm4gYX0sZ2I6ZnVuY3Rpb24oYSl7dGhpcy5mYlthXXx8KHRoaXMuZmJbYV09MCk7dGhpcy5mYlthXSs9MTs1PHRoaXMuZmJbYV0mJiF0aGlzLktnW2FdJiYodGhpcy5LZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmd3KCksITApKX0sJGY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sCnNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxidjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5hdihhLmRhdGEpfSxhdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuY2EuZXZlbnRsaXN0ZW5lci5sZW5ndGgsCmQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sWWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sZGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuJGcoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHwKYls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuUnIoYSkpcmV0dXJuOyhiPXRoaXMuZGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxScjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxvZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxPYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHlnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxIaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKVGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx4ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OwowPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0seWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktCmEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoYSl9LmJpbmQodGhpcyksMTAwKX0sd2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxJPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrOwpjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUk7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMTg1OTc3NTM5MyYKNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0k9SStsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihJKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LHBiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJgoxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxtdDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGllOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLAplPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iub2I/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChuKXt9YS5pc1BoYW50b21KUz0KYjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LGFzOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5pZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFFhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGtqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApSczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxYbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5WaSgpfHxhLmtqKCl8fGEuUnMoKXx8YS5tbSgpfHxhLlhuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGhkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxLcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxkdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx0ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVGgoYikrIjoiK3RoaXMuVGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFRoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSwkZTpmdW5jdGlvbihhKXt0aGlzLlBhPWF9LHFnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUGE7dGhpcy5PZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHFjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5xZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZWQpe3ZhciByPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYocj1rLlRhKGEsYikpO2YmJihyPWsuVGEocixmKSk7YyYmKHI9ay5UYShyLGMpKTtoJiYocj1rLlRhKHIsaCkpO2VkJiYocj1rLlRhKHIsaCkpO2UucWMocil9LGR2OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSYmMTAyMyE9YS5jb2RlJiYxMDE4IT1hLmNvZGUpe3RyeXtpZihsYSYmKGIuc2Vzc2lvbl9pZD1sYSksYi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iLGEuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKSxiLmV2ZW50PWEuY29kZSxiLnNpdGVfaHJlZj0KdGhpcy5xcygpLGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH19Y2F0Y2goZCl7fXJldHVybiBifX0sT2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kdihhKTtpZihiKWlmKCFsfHwhbC5iYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwueGQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wud2EoYSwhMCk7YT1sLndhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIjthLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wuSGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5FY3x8KHRoaXMuRWM9e30pO3RoaXMuRWNbZl18fCh0aGlzLkVjW2ZdPTApO3RoaXMuRWNbZl0rKzsxMDx0aGlzLkVjW2ZdfHwoZj1sLnhkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLndhKGYsITApLGY9bC53YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIisKZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxHZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwua3EoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxvZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoPwp0aGlzLmJiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxxZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5qZChhKToiIn0samQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGFxOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuQWUoYSl8fHRoaXMucHQoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5ZZSYmd2luZG93LnNhbmRib3guWWVbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7CmlmKHRoaXMub2coYSkpcmV0dXJuIHRoaXMub2coYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnBiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuVWEoYSxiLkdhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLm5kKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLlJvKGMsYSk7cmV0dXJuIGN9LFVhOmZ1bmN0aW9uKGEsYiwKZCxmLGMsaCxlLHIpe3ZhciBrPWh8fGw7aD0hMDtyJiYoaD0hMSk7aWYoayYmay5iYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2sud2EoYSxoKTtoPWsud2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBrLkhhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYShhLGIsZCxmLGMsayxlLHIpfS5iaW5kKHRoaXMpLDUwMCl9LCRnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciByPSEwO2UmJihyPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHIpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxXdDpmdW5jdGlvbihhLGIsZCl7dGhpcy4kZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5EYylmb3IodmFyIGMgaW4gdGhpcy5EYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxhaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlVhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuV3QoZi5uZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRjPWF9LFd4OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5VYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxNcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sa3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuQWt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93Lm1nPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fAp7fX1jLnprPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuVHU9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuaXU9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSng9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Bcj17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5OZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuSW89e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5peD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnlxPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5hZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLiRjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5MZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuTG89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5PYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVmQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuWGQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLktvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi4kaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLmx1PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IucmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5iZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSXg9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZng9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5qdT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMuemt8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnJvPXRoaXMuYVsyXTt0aGlzLlVxPXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxXTt0aGlzLkFwPXRoaXMuYVs3XTt0aGlzLiRtPXRoaXMuYVs1XTt0aGlzLnN1PXRoaXMuYVs2XTt0aGlzLktqPXRoaXMuYVsyXTt0aGlzLiR1PXRoaXMuYVsxMF07dGhpcy5icD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs3XX1jLnNxPWI7Yi5wcm90b3R5cGU9e3FvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybzp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MdDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXA6dGhpcy5abShhKX0sWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLiRtOnRoaXMucnUoYSl9LHJ1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zdTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktqOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kdTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYT1jLnNxfHxtYSxmZD1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1mZC5xbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkJrPWI7Yi5wcm90b3R5cGU9e3JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxxYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4Iil9LGtzOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGZkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5mZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5mZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LHdjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmUodGhpcy5xYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmZkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxndDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndjKCkrIjIifSxRZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlKHRoaXMua3MoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5mZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMuQmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXE9dGhpcy5hWzRdO3RoaXMucG49dGhpcy5hWzddO3RoaXMuVWo9dGhpcy5hWzZdO3RoaXMua2k9dGhpcy5hWzddO3RoaXMuRnA9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5ndj1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXE6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBuOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmppKGEpfSxqaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2k6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5ndnx8bmEsZ2Q9Cm5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWdkLmNxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/CmYuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51Zj1ifSkoYyk7dmFyIEo9Yy51Znx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVszXX1jLk9xPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIG9hPWMuT3F8fG9hLGhkPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWhkLllqKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Mudm09CkouZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5HPW51bGw7dGhpcy5BYz0xMDA7dGhpcy54Yj0wO3RoaXMuSWE9MTUwO3RoaXMuQWI9MDt0aGlzLkp2KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy54Yjw9dGhpcy5JYT8odGhpcy54YisrLHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpOjA+dGhpcy5JYSYmKHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpfSxBdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhiPnRoaXMuSWE/ITA6ITF9LHpkOmZ1bmN0aW9uKCl7dGhpcy54Yj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sSnY6ZnVuY3Rpb24oYil7dGhpcy5HPWJ9LGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sSzpmdW5jdGlvbihiKXt0aGlzLkphW2IucWIoKV09YjtLJiZLLllnJiZLLmZ3KGIpfSxBeTpmdW5jdGlvbigpe3JldHVybiBlLk9hKHRoaXMuSmEpfSwKSjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9LGx0OmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTnk6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy52bXx8dDsoZnVuY3Rpb24oYyl7Yy54bT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkFjPTEwO3RoaXMueGI9MDt0aGlzLklhPTUwO3RoaXMuTj1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnNiPSIiO3RoaXMuaGc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApnPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt9LFN2OmZ1bmN0aW9uKGIpe3RoaXMuTj1ifSxCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk59LE12OmZ1bmN0aW9uKGIpe3RoaXMuS2U9Yn0senk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sSmU6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLnhiPD10aGlzLklhJiYodGhpcy54YisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuQWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LHhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEFkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sUHk6ZnVuY3Rpb24oKXt9LFY6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSHMoKXx8dGhpcy5PbygpO3RoaXMuQWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKQ3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sT286ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZ2EoMTApKX0sSHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFM6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxIeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxmYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxEZTpmdW5jdGlvbigpe3JldHVybiExfSxDaDpmdW5jdGlvbihiKXt0aGlzLnNiPWJ9LHl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2J9LHhoOmZ1bmN0aW9uKCl7dGhpcy5zYj1udWxsfSxFeTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuc2ImJihiPSEwKTtyZXR1cm4gYn0sSnk6ZnVuY3Rpb24oKXt0aGlzLmhnfHwodGhpcy5oZz0hMCl9LHNjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHZ5OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIG49Yy54bXx8bjsoZnVuY3Rpb24oYyl7Yy5zaT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLkRmPSIxIjt0aGlzLkVmPSIyIjt0aGlzLnlvPSIzIjt0aGlzLkljPTA7dGhpcy5laD0zMDt0aGlzLkZiPVtdO3RoaXMuWmE9W107dGhpcy5iYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5QZj10aGlzLldoPSExO3RoaXMuc3RhdHVzPXRoaXMuSWM7dGhpcy5pZD1lLmdhKDEwKTt0aGlzLkJkKGIpO3RoaXMuS3YoYSl9LGM6ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7dGhpcy5XaHx8KHRoaXMuV2g9ITAsZS5HZSgpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtTJiZTLk1iJiYhcGEmJihwYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sRjpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLlB2KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5QaCgpLHRoaXMuUGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLkZiLnB1c2goYiksdGhpcy5aYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkZiJiYwPHRoaXMuRmIubGVuZ3RoJiYodGhpcy5GYj1lLnVuaXF1ZSh0aGlzLkZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5GYi5qb2luKCIsIikpKTtpZih0aGlzLlphKXtmb3IodmFyIGc9MDtnPHRoaXMuWmEubGVuZ3RoO2crKyl0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXT09dGhpcy5iY1tiXSYmYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSx0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXTwKdGhpcy5iY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSxiPXRoaXMuWmFbZ10ucmVhc29uKTt0aGlzLmJjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LFB2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZn0sUXY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnlvfSxLYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSWN9LEdmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxteTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5FZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuSWN9LEJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPQpifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEt2OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxoczpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LFp0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5zaXx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbD10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbNV07dGhpcy5Uaz10aGlzLmFbMl07dGhpcy5Ebz10aGlzLmFbNF07dGhpcy5QdD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs2XX1jLlhpPWI7Yi5wcm90b3R5cGU9e1VsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WbDp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQmo6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRrOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuRG86dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlB0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5YaXx8cWEsaWQ9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuVWwoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSwKaWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTiYmdGhpcy5OKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5Eanx8VDsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuT2Q9bnVsbDt0aGlzLnJ4PTFFMzt0aGlzLm5oPW51bGw7dGhpcy5Kdz0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub2IpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Kci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuRHMuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5DcyhhLApiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV4KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52eChiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkJzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy53cShhKX0uYmluZCh0aGlzKSl9LHdxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sdXg6ZnVuY3Rpb24oYil7dGhpcy5PZHx8KHRoaXMuT2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd4KGIpfS5iaW5kKHRoaXMpLHRoaXMucngpKX0sd3g6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2QpO3RoaXMuRigpfSx2eDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZCl9LApCczpmdW5jdGlvbihiKXt0aGlzLnN5KGIpO3RoaXMubmg9bmV3IERhdGU7dGhpcy5uaC10aGlzLld1PHRoaXMuSnc/dGhpcy5GKCk6dGhpcy5zKCl9LERzOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuQmQobmV3IFQoYSkpKTt0aGlzLkYoKX0sSnI6ZnVuY3Rpb24oKXt9LENzOmZ1bmN0aW9uKCl7dGhpcy5XdT1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk9hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZywKdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRWp8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rdj10aGlzLmFbNV07dGhpcy5Qcz10aGlzLmFbM107dGhpcy51dT10aGlzLmFbNl07dGhpcy4keD10aGlzLmFbN107dGhpcy5Paz10aGlzLmFbMTBdO3RoaXMucm49dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMl19Yy5Haj1iO2IucHJvdG90eXBlPXtqdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Y6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51dTp0aGlzLlp4KGEpfSxaeDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHg6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9rOgp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1YT1jLkdqfHx1YSxqZD1uZXcgdWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1qZC5qdig0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3RoaXMubmcoKTt0aGlzLnBnKCk7dGhpcy54cT0hMX0sbmc6ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5OYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxwZzpmdW5jdGlvbigpe2lmKCF0aGlzLk5iKXt2YXIgYj0KdGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuTmI9ITApO3RoaXMuVihhKX19LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTiYmKDAsdGhpcy5OKSgpfS5iaW5kKHRoaXMpKX0sSmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5FZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcykpfSxFZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLktlJiYoMCx0aGlzLktlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTsKcmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgdmE9Yy5Za3x8dmE7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTTpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkljO3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMX0sYzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/CmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuV2Q9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmxiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5sYj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5sYj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMubGI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTsKdGhpcy5LYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuZWgmJiF0aGlzLmhhKCkmJih0aGlzLmxiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMuaGEoKSYmKHRoaXMuS2EoKSx0aGlzLmdldFBsYXllcigpLnhxPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5zYjthJiYoYS50ZCgpLGEuZ2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuS2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5laCYmIXRoaXMuaGEoKSYmKHRoaXMubGI/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLk1jLmluZGV4T2YoYSkmJnRoaXMuTWMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5lYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm8oImFkZXJyb3IiLGIuY29kZSksdGhpcy5NYy5sZW5ndGg+PXRoaXMuV2QmJnRoaXMudSgpKX0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5pKCJKVzogIitiLnR5cGUpfSx1OmZ1bmN0aW9uKGIpe2I/dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xOnRoaXMua2U/dGhpcy5rZSsrOnRoaXMua2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSGgoYS52aWRlb1RhZyk/YS5OYj90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLktjfHx0aGlzLmlzUGxheWluZz8odGhpcy5rZT50aGlzLmxlJiYoYj0hMSksdGhpcy5GKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEubmcoKSxhLnBnKCksYS5OYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgd2E9Yy5Ya3x8d2E7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5kcygpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IHZhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5KKGcpfHx0aGlzLmx0KGcpfHwodGhpcy5LKGcpLGc9bmV3IHdhKGcsdGhpcy5HKSxnLk0oKSxnLmMoKSl9fXRoaXMuSSgpfX0seHk6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sZHM6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnBiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB4YT1jLlprfHx4YSx5YT1uZXcgeGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBqPXRoaXMuYVs2XTt0aGlzLkN3PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuSWs9YjtiLnByb3RvdHlwZT17b2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBqOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMuSWt8fHphLGtkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWtkLm9qKDQpOyhmdW5jdGlvbihjKXtjLlpuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTsKdmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLlpufHxBYTsoZnVuY3Rpb24oYyl7Yy5Zbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHwKYi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5Zbnx8QmE7KGZ1bmN0aW9uKGMpe2MuJG49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5PYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPQpiW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IEFhKGcpLHRoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuJG58fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ibj10aGlzLmFbNF07dGhpcy5LdT10aGlzLmFbMV07dGhpcy5Udz10aGlzLmFbOV07dGhpcy54dT10aGlzLmFbNV07dGhpcy5KdD10aGlzLmFbMV07dGhpcy5IdD10aGlzLmFbMl07dGhpcy5CbD10aGlzLmFbOF07dGhpcy5rcD10aGlzLmFbNF07dGhpcy5iaj10aGlzLmFbNF07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVszXX1jLlFzPWI7Yi5wcm90b3R5cGU9e0duOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ibjp0aGlzLkp1KGEpfSwKSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkt1OnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Udzp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh1OnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KdDp0aGlzLkd0KGEpfSxHdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHQ6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJsOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5haihhKX0sYWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJqOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuUXN8fEVhLGxkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5Hbig0KTsoZnVuY3Rpb24oYyl7Yy5Nbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5pYihiKX0uYmluZCh0aGlzKSl9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuTW58fEZhOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucWE9dGhpcy52Yz10aGlzLnhhPXRoaXMuU2M9ITE7dGhpcy51aD1lLndiKDEwKTt0aGlzLlZoPSEwO3RoaXMuZ2M9dGhpcy5OZz0hMTt0aGlzLmloKCk7dGhpcy5ocSgpO3RoaXMuU2EoKX0sS3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLnFiKCksCiI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRGE/Yi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5EYT90eXBlb2YgYi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuRGE/Yi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi5EYT90eXBlb2YgYi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlRkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuVGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuVWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS52YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi52YToidW5kZWZpbmVkWCIsIjsiLGIuUj8KdHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuWmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5yYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudmF9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmMpe3ZhciBiPXRoaXMucmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy52Yz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMudmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy52Y30sanQ6ZnVuY3Rpb24oKXtpZighdGhpcy5NZyl7dmFyIGI9CnRoaXMucmIoKSxhPXRoaXMuaXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk1nPSEwKX1yZXR1cm4gdGhpcy5NZ30saXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5TYz0hMCk7cmV0dXJuIHRoaXMuU2N9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxYZTpmdW5jdGlvbigpe3RoaXMuZ2M9ITA7dmFyIGI9dGhpcy5CZygpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlFhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5oYz0hMDtpZihlLnViKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSx3eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2cmJmIuYWRzJiYodGhpcy5jZz1iLmFkcyk7cmV0dXJuIHRoaXMuY2d9LGhxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLkthKCk7dGhpcy5hYSghMCk7dGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7CnRoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQmcoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksNTApfSxpaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5qdCgpKXt2YXIgYT0KdGhpcy5yYigpLGc9dGhpcy5KYigpO2EmJmcmJih0aGlzLnJiKCksdGhpcy5KYigpLHRoaXMuZ2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nYz90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMucmIoKX1lbHNlIHRoaXMuTmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJiKCksYj10aGlzLkpiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5hYSgpKToodGhpcy5hYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuTmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5paCgpfS5iaW5kKHRoaXMpLDUwKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0saXE6ZnVuY3Rpb24oKXt0aGlzLm1jfHwodGhpcy5tYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMubWMhPWIuYWRzLnN0YXRlJiYodGhpcy5tYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5tYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLm1jPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pcSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXswPD1lLmhkKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlc/dGhpcy51KCEwKToodGhpcy5xYT0hMCx0aGlzLnMoImVtcHR5IHZhc3QiKSl9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwodGhpcy5WaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkYodGhpcy5WaCxmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbnE6ZnVuY3Rpb24oKXt0aGlzLkZ5fHwoMTA8dGhpcy5zeD8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN4KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuenYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnEoKX0uYmluZCh0aGlzKSw1MCkpKX0senY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLnR4KXt0aGlzLnR4PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIEdhPWMuTG58fEdhOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkloKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5JaChiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxJaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS5PYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm1hfHx0aGlzLkooYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuSyhhKSwobmV3IEdhKGEsdGhpcy5HKSkuYygpKSk7cmV0dXJuITB9cmV0dXJuITF9LEk6ZnVuY3Rpb24oKXt0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMuQWMpfX0pfSkoYyk7dmFyIEhhPWMuTm58fEhhLElhPW5ldyBIYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ucj10aGlzLmFbOV07dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VcD10aGlzLmFbNV07dGhpcy5vcD10aGlzLmFbN107dGhpcy5IbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5tcD10aGlzLmFbM107dGhpcy5xcD10aGlzLmFbMV07dGhpcy5Gbz0KdGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNl19Yy5PeD1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubnI6dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KcDp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXA6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vcDp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGw6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldvOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXA6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFwOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7CnZhciBKYT1jLk94fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5tcig0KTsoZnVuY3Rpb24oYyl7Yy5sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7Yi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlMoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0sbGE6ZnVuY3Rpb24oKXt9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLk4mJgoidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLAphPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5sbnx8S2E7KGZ1bmN0aW9uKGMpe2Mua249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuS2I9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWmI9ITE7dGhpcy53aCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT1iLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlpiPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTsKYi5nZXRQbGF5ZXIoKTt0aGlzLlhjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuWWYoKTp0aGlzLnMoKX0sWGM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7YS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuWmI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7CmEuZ2V0UGxheWVyKCk7dGhpcy5aYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMucygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhjLmJpbmQodGhpcyksMTAwKX19LFlmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmCih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LYiksdGhpcy5zKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5LYiYmKHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHwodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkYoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5ZZi5iaW5kKHRoaXMpLDUwKX19LHdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiYKYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlpiPSEwLHRoaXMucygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53aCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmtufHxMYTsoZnVuY3Rpb24oYyl7Yy5tbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmCnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5tbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR5PXRoaXMuYVs0XTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLk1pPXRoaXMuYVs2XTt0aGlzLlNwPXRoaXMuYVsyXTt0aGlzLlNqPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzddfWMuc3I9YjtiLnByb3RvdHlwZT17Y3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5keTp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGk6dGhpcy5MaShhKX0sTGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5NaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3A6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5zcnx8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuY3koNCk7KGZ1bmN0aW9uKGMpe2MuaG49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZWxfO2F8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5lbD9hPWIuZWwoKToiZnVuY3Rpb24iPT10eXBlb2YgYi5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCgpKSkpO3RoaXMuUyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCihiPWJbMF0pO3RoaXMuVihiKX0saWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YSYmYi5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZTIifSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLm11dGVkJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5tdXRlZCYmKGI9YS5tdXRlZCgpKTtyZXR1cm4gYn0sc2M6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5obnx8UGE7KGZ1bmN0aW9uKGMpe2MuZ249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5YZigpO2Iub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5Kb3x8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygidGltZXVwZGF0ZSIpO3RoaXMuRighMCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX0ZJUlNUX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLm8oImFkc2Vycm9yIik7dGhpcy5BcyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LEFzOmZ1bmN0aW9uKGIpe3ZhciBhPTk5OTk5OTtpZihiLmRhdGEmJmIuZGF0YS5BZEVycm9yKWZvcih2YXIgZyBpbiBiLmRhdGEuQWRFcnJvciliLmRhdGEuQWRFcnJvci5oYXNPd25Qcm9wZXJ0eShnKSYmIm51bWJlciI9PXR5cGVvZiBiLmRhdGEuQWRFcnJvcltnXSYmKGE9Yi5kYXRhLkFkRXJyb3JbZ10sdGhpcy5vKGEpKTs5MDE9PWE/dGhpcy5zKCk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PQphPyh0aGlzLlpiPSEwLHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMuSm89ITAsdGhpcy5zKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5YZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz90aGlzLkYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBRYT1jLmdufHxRYTsoZnVuY3Rpb24oYyl7Yy5qbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UmJiJmdW5jdGlvbiI9PQp0eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy56ZCgpLHRoaXMuSSgpfX0pfSkoYyk7dmFyIFJhPWMuam58fFJhLFNhPW5ldyBSYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kaz10aGlzLmFbMV07dGhpcy5FdD10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsxXX1jLkh3PWI7Yi5wcm90b3R5cGU9e2NrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZGs6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgVGE9Yy5Id3x8VGEsb2Q9bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9b2QuY2soNCk7KGZ1bmN0aW9uKGMpe2MuWmk9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5oaD1hfSxNOmZ1bmN0aW9uKCl7fSxIZTpmdW5jdGlvbihiKXt0aGlzLmhoPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmhoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTt0aGlzLlYoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKUDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgVWE9Yy5aaXx8VWE7KGZ1bmN0aW9uKGMpe2MuWWk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxIZTpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZhPWMuWWl8fFZhOyhmdW5jdGlvbihjKXtjLiRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFVhKGQsYSksdGhpcy5KKGQpfHwoZC5IZShhKSx0aGlzLksoZCksCmQ9bmV3IFZhKGQsdGhpcy5HLGcpLGQuSGUoZyksZC5jKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgV2E9Yy4kaXx8V2EsWGE9bmV3IFdhKGlhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbMTBdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMuSm49dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzldO3RoaXMueGk9dGhpcy5hWzldO3RoaXMuT3U9dGhpcy5hWzZdO3RoaXMuRmw9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy50cT1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXA6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5vOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53czp0aGlzLkluKGEpfSwKSW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpuOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vazp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhpOnRoaXMuTnUoYSl9LE51OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PdTp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYT1jLnRxfHxZYSxwZD1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1wZC5QcCg0KTsoZnVuY3Rpb24oYyl7Yy55bD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07CnRoaXMuUyhiKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxRYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBaYT1jLnlsfHxaYTsoZnVuY3Rpb24oYyl7Yy54bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5RYSgpPwooJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5MYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSkpOnRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyICRhPWMueGx8fCRhOyhmdW5jdGlvbihjKXtjLnpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFphKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgJGEoYix0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFiPWMuemx8fGFiLGJiPW5ldyBhYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy50bz10aGlzLmFbM107dGhpcy5Edj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy5ycT1iO2IucHJvdG90eXBlPXtobTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW06dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRvOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Edjp0aGlzLmooYSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLnJxfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5obSg0KTsoZnVuY3Rpb24oYyl7Yy5xbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLlBlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5mYSgpO3JldHVybn10aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlYoYik6dGhpcy5mYSgpfSxYdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnNiLGc9dGhpcy5xYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5NYiYmKDA8PWcuaW5kZXhPZihkKXx8YS50ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUGU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxSYTpmdW5jdGlvbigpe3RoaXMuUGUrKztpZigxMDx0aGlzLlBlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGxhOmZ1bmN0aW9uKCl7fSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLk4mJnRoaXMuTigpfX0pfSkoYyk7dmFyIGRiPWMucW18fGRiOyhmdW5jdGlvbihjKXtjLnBtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHhhOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8Cih0aGlzLnRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMudGIrKywxNTx0aGlzLnRiKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMubmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy55YSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLnhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkhyPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLkhyPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWHUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMucG18fGViOyhmdW5jdGlvbihjKXtjLnJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5ybXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFxPXRoaXMuYVsxXTt0aGlzLmw9dGhpcy5hWzVdfWMubGo9YjtiLnByb3RvdHlwZT17cHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFxOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5sanx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQucHEoNCk7KGZ1bmN0aW9uKGMpe2Mud2s9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5WKGIuZWxlbWVudCl9LFJiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMud2t8fGliOyhmdW5jdGlvbihjKXtjLnZrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PQpiLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCl9fSl9KShjKTt2YXIgamI9Yy52a3x8amI7KGZ1bmN0aW9uKGMpe2MueGs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMueGt8fGtiLGxiPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbz10aGlzLmFbNF07dGhpcy5Gbj10aGlzLmFbNF07dGhpcy5Laz10aGlzLmFbM107dGhpcy56aT10aGlzLmFbMV07CnRoaXMuTnQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMTBdfWMuV2k9YjtiLnByb3RvdHlwZT17Wm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Gbjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5OdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIG1iPWMuV2l8fG1iLHNkPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXNkLlpvKDQpOyhmdW5jdGlvbihjKXtjLlZrPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTt0aGlzLnBoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuUyhnKTt0aGlzLlYoZyk7dGhpcy5kZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kZCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1xOmZ1bmN0aW9uKCl7ZS5UZyh0aGlzLmRkKTtlLnhlKHRoaXMuZGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tcSgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxEZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIG5iPWMuVmt8fG5iOyhmdW5jdGlvbihjKXtjLlVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCEwKX19KX0pKGMpO3ZhciBwYj1jLlVrfHxwYjsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTsKZS5UZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IHBiKGIsdGhpcy5HKSkuYygpKSk7dGhpcy5BYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5BYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcWI9Yy5Xa3x8cWIscmI9bmV3IHFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs5XTt0aGlzLm1sPXRoaXMuYVs3XTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLlRzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuRm09YjtiLnByb3RvdHlwZT17Y3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMucmo6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tbDp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWHI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgc2I9Yy5GbXx8c2IsdGQ9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuY3QoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkNrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEx2OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSwKYil7dGhpcy5kYXRhW2FdPWJ9LFBvOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuQ2t8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5YYT1hO3RoaXMuc2c9dGhpcy5maT0hMTt0aGlzLmpoPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeChhKSk7dmFyIGU9dGhpcy5EYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC5CZSh0aGlzLlhhLnVybCkmJmwuSmQpe3ZhciBoPW5ldyB4KGEudXJsKTsKaC5MdigiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLm5hKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5uYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuRGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuc2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCwKdGhpcy5YYS51cmwsITEpOnRoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy5maXx8KHRoaXMuRGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLkRiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuRGIuc2VuZChhKX1jYXRjaChjKXtsJiZsLkJlKHRoaXMuWGEudXJsKT9sLkpkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuQmUodGhpcy5YYS51cmwpLHRoaXMuamgmJnRoaXMuamgoKX1yZXR1cm4gdGhpcy5EYn19fSkoYyk7dmFyIHRiPWMuRGt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmpjPSIiO3RoaXMuJGQ9dGhpcy5pYz10aGlzLm5iPW51bGw7dGhpcy5McT10aGlzLnliPXRoaXMuWmc9ITE7dGhpcy5HYT0iIjt0aGlzLlZnPSExO3RoaXMuQ2E9CnRoaXMua2Q9IiI7dGhpcy5SZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLkhnPXRoaXMuVGI9IiI7dGhpcy5qZT0hMTt0aGlzLmhmPTA7dGhpcy55Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5FYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVmI9IiI7dGhpcy56Yj1bXTt0aGlzLldiPVtdO3RoaXMuVWI9IiI7dGhpcy5qZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnVlPSExO3RoaXMub3E9dGhpcy5LZD1udWxsO3RoaXMuRmg9dGhpcy5GYz10aGlzLmpnPXRoaXMubmY9dGhpcy5KZD10aGlzLmFlPXRoaXMuSmM9CiExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMubWQ9MDt0aGlzLkpnPSExO3RoaXMuSWc9MUUzfWMuRWs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuc2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5qYyxhZHRhZ21vZGlmaWVyOnRoaXMubmIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmljLGFkdGFncmVnZXg6dGhpcy4kZCxqc3BvcHVwczp0aGlzLlpnLHNpZGVsb2Fkczp0aGlzLnliLGRpc2FibGV0ZXN0czp0aGlzLkxxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuVmcsZ2xvYmFsQ29uZmlnOnRoaXMua2QsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5SZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5UYixob21hZEFkcGF0aDp0aGlzLkhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuamUsCnRlc3RDb29raWVBdHRlbXB0czp0aGlzLmhmLEhPTUFEX1ZFUklGSUVEOnRoaXMueWYsSE9NQURfQkxPQ0tFRDp0aGlzLndmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkViLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy54Zix0ZXN0SGlkZTp0aGlzLlZiLHRlc3RUYWdzOnRoaXMuemIsdGVzdFRhZ3NKUzp0aGlzLldiLHRlc3RDb29raWU6dGhpcy5VYix0aHJvdHRsZTp0aGlzLmpmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMudWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5vcSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5hZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5KZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5TYixzZXJ2ZXJJZDp0aGlzLkFoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5wYywKdnBhaWQ6dGhpcy5GYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuYWl9fSxGczpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LGVzOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLndiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuTXAoYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5zYSYmIWIpcmV0dXJuIG5ldyB4KGEpO2M9dGhpcy5BZShhKTtlPXRoaXMuemEoYSk7Yz8odGhpcy54YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy54ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmpjfHx0aGlzLm5ifHx0aGlzLmljfHx0aGlzLiRkKSYmKGs9dGhpcy5mdShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdzKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5wYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy54YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxCZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkFlKGEpO3JldHVybiBifSxnczpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5yeTtyZXR1cm4ibm9uZSJ9LG5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy5BaF19LHhkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sZmg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sZXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5maChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pOwpCPVtdO2ZvcihsIGluIGMpQi5wdXNoKGwrIj0iK2NbbF0pO2M9Qj1lbmNvZGVVUklDb21wb25lbnQoQi5qb2luKCImIikpfWVsc2UgYz10aGlzLmZoKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9bD1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWwucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sZnU6ZnVuY3Rpb24oYSl7dGhpcy5qYyYmKGErPXRoaXMuamMpO2lmKHRoaXMubmIpZm9yKHZhciBiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5uYltiXSkpO3RoaXMuaWMmJihhPXRoaXMuZXUoYSx0aGlzLmljKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlZnPSEwO3RoaXMua2Q9YTt0aGlzLkNhPWI7dGhpcy5WZT1kO3RoaXMuS2Q9Yzt0aGlzLm5jPWU7dGhpcy5TYj1ofHx7fTt0aGlzLlZ0KCk7aWYoInN0cmluZyI9PQp0eXBlb2YgdGhpcy5DYSl0aGlzLlR0KCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLlljKCl9Y2F0Y2goayl7dGhpcy5uYSgibm9DbGllbnRDb25maWciKX19LGhiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxWdDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5rZCt0aGlzLlFjKCJnbG9iYWwiKSksdGhpcy56cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLlljKCl9LmJpbmQodGhpcyksITApfSxUdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5RYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLlFjKCJjbGllbnQiKSksdGhpcy5ZYy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuWmUoImNsaWVudCIpO3RoaXMubmEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFFjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLndiKCk7dGhpcy5TYiYmdGhpcy5TYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuU2ImJnRoaXMuU2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5uYz0hMSk7dGhpcy5uYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm5jPwp0aGlzLm5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmJhPXRoaXMuUmc9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMud2YpKTt0aGlzLkJiKCk7ZS5xYyhrLlR1KTsoYj1lLmhkKHRoaXMubmQoKSkpfHwoYj1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx6czpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5UYnx8dGhpcy5HYXx8dGhpcy5ZYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKSwKdGhpcy5CYigpKX19LFljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuQ2F9ZWxzZSBhPXRoaXMuQ2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihhLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlRiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5IZz1hLmFkcGF0aHx8IiI7dGhpcy5qZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkFoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVGImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoPwp0aGlzLnFkKCExKToodGhpcy5zYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5CYigpKX0scWQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB4KHRoaXMueGQoKSksZD10aGlzLnphKHRoaXMuVGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5UYit0aGlzLlFjKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5sdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiY3VzdG9tZXIiKTthP3RoaXMuUG0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5QbT0hMCwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxsdzpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe310aGlzLkpkPXRoaXMuWGIoYi5zdHJpY3QpO3RoaXMubmY9dGhpcy5YYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5qZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucGM9dGhpcy5YYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuWGIoYi5lbmFibGVkKTt0aGlzLlZiPWIudGVzdGhpZGV8fCIiO3RoaXMuemI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLldiPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuamM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1iLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuaWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLiRkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlpnPWIuanNwb3B1cHN8fCExO3RoaXMueWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuRmM9Yi52cGFpZHx8ITE7dGhpcy5TYi52cGFpZD10aGlzLkZjO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5WYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYWk9Yi52bWFwc3x8IiI7dGhpcy5VYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBzKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5qZSYmKHRoaXMuVWI9bnVsbCk7dGhpcy5qZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnVlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy51ZT0hMCx0aGlzLnFkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLkl3KCkmJgoodGhpcy5WYnx8dGhpcy5XYnx8dGhpcy56Ynx8dGhpcy5VYik/dGhpcy5WZT8odGhpcy5zYT10aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5lZSgpLHRoaXMuQmIoKSk6dGhpcy5ydygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN3KCkpfX0scnc6ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy50dygpfSx0dzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLndpZHRoPTE7Yy5oZWlnaHQ9MTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3JjPSJhYm91dDpibGFuayI7dmFyIGg9ZS5nYSgxMCksQj1lLmdhKDEwKSxrPWUuZ2EoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGssZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmEoQikrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UucGIoYShoKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChsKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2lmKDMhPWQpe3ZhciBhPWUuaWUoKTshYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5RYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKTt0aGlzLkJiKCl9LElkOmZ1bmN0aW9uKGEpe3RoaXMuSmM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9CnRoaXMuc2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKGEpKSx0aGlzLkJiKCksdGhpcy5lZSgpKX0scXc6ZnVuY3Rpb24oKXtpZih0aGlzLlZiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlZiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuVmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuTmgoKX1lbHNlIHRoaXMuTmgoKX0sCk1oOmZ1bmN0aW9uKCl7dmFyIGM7dmFyIGQ7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpO3RoaXMud3coYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmVmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5JZCh0aGlzLkhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9dGhpcy56Yj1udWxsLHRoaXMuZWYoKX0sd3c6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpOwp0aGlzLnh3KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5NaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5XYiYmdGhpcy5XYi5sZW5ndGgpe3ZhciBjPXRoaXMuV2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSx4dzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LGVmOmZ1bmN0aW9uKCl7dGhpcy5VYj8odGhpcy5oZisrLHRoaXMuSGEobmV3IHgodGhpcy5VYiksdGhpcy5wdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuSWQodGhpcy54ZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmhmP3RoaXMuZWYoKTp0aGlzLmZmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuS2goKTp0aGlzLmZmKCJBQUEiKX0sS2g6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSk7dGhpcy5CYigpO3RoaXMuZWUoKX0sQmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuUWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5KYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMueWYpKTt0aGlzLktkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuS2QmJnRoaXMuS2QoKX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLm5mJiZ0aGlzLkZzKCkpe3ZhciBhPXRoaXMuZXMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFBoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsYixjLGYsaCxCKXt0aGlzLm1kfHwodGhpcy5tZD0wKTt0aGlzLm1kKys7dGhpcy5tZD50aGlzLklnJiYhdGhpcy5KZyYmKHRoaXMuSmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLklnLCEwKSk7YT1uZXcgdGIoYSxiLGMpO2YmJihhLmZpPSEwKTtoJiZlLm10KCkmJihhLnNnPSEwKTtCJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxWZjpmdW5jdGlvbigpe2UuUWEoKXx8ZS5VYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubmEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMueGMoKXx8KGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTsKaC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxvdzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5haX0sa3E6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5oeC5iaW5kKHRoaXMpLAp0aGlzLmd4LmJpbmQodGhpcykpfSxoeDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuQ3IoKX0sZ3g6ZnVuY3Rpb24oKXt9LENyOmZ1bmN0aW9uKCl7ZS5xYyhrLkJyKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLm5hKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxlZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnliLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMueWIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy55YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBSO3dpbmRvd1tjLndjKCldPXRoaXM7ZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLmpmfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sd2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFhiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLHAsbix2LHUsdztwPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHgucHVzaChlKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PAoyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKHA+Pj4yOSk7eC5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO3A9bDtuPW07dj1xO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl3PWMoZSw1KSsocCZufH5wJnYpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStuJjQyOTQ5NjcyOTU7cT1xK3YmNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciB1Yj1jLkVrfHx1YixsPW5ldyB1Yjt3aW5kb3cudWc9bDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adz10aGlzLmFbNF07dGhpcy5XbT10aGlzLmFbMl07dGhpcy5LaT10aGlzLmFbMV07dGhpcy5jdz10aGlzLmFbMl07dGhpcy5rbD10aGlzLmFbNF07dGhpcy5zdD10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbN107CnRoaXMuVnI9dGhpcy5hWzddO3RoaXMuWW09dGhpcy5hWzNdO3RoaXMuWnE9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMl19Yy53bz1iO2IucHJvdG90eXBlPXtZdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnc6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LaTp0aGlzLmJ3KGEpfSxidzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3c6dGhpcy5qbChhKX0samw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtsOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdDp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Wcjp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlltOnRoaXMuWXEoYSl9LApZcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWnE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB2Yj1jLndvfHx2Yix1ZD1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT11ZC5Zdyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLm0uUD90aGlzLlZhPWEubS5QKCk6dGhpcy5WYT0iIjthLm0uUGcmJmEubS5QZyh7cGF1c2U6dGhpcy50ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLkxlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuJHcuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5hYjt0aGlzLnBsYXllcj10aGlzLmIubTt0aGlzLkhiPXRoaXMuVGM9ITE7dGhpcy5LcD0xRTM7dGhpcy5qYT0KbnVsbDt0aGlzLlQ9Yjt0aGlzLnVhPXt9O3RoaXMudmlkZW89e307dGhpcy5HZD17fTtlLmdiKCJuZXdCaWdBZElkIik7dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmJmPTA7dGhpcy5SYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlJjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlJjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuRmQ9ITE7dGhpcy5iaD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuUGM9ITE7dGhpcy5TaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLk1iPSExO3RoaXMuenE9CmUuZ2EoMTApO3RoaXMuUGI9ZS5nYSgxMCk7dGhpcy5PYj1lLmdhKDEwKTt0aGlzLkdoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm9jPXRoaXMudmI9ITE7dGhpcy5tZT1udWxsO3RoaXMuTmQ9dGhpcy5DYj10aGlzLndlPXRoaXMuU2U9dGhpcy5mZT10aGlzLmJkPXRoaXMuZGY9dGhpcy5hYz10aGlzLlBkPXRoaXMubGg9dGhpcy5lZD10aGlzLkt3PXRoaXMua2I9ITE7dGhpcy5lYz1bXTt0aGlzLlliPXt9O3RoaXMua2Y9ITF9Yy55az1iO2IucHJvdG90eXBlPXtCaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pO3JldHVybiBifSxRaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5QYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULkpjP2UudHJhY2soImFkY2FsbCIsIjEiKToKZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay5Mbyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxGZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5rYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmJmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5ULmxxKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLlFoKCksbmV3IFUodGhpcyxhLHRoaXMuYmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5GYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5RaCgpLG5ldyBVKHRoaXMsYSx0aGlzLmJoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULkZjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLAprZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLk1hKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkZlKGEsYixjKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7dGhpcy5OZD10aGlzLkNiPXRoaXMuZWQ9ITE7dGhpcy5nPWE7dGhpcy5Udih0aGlzLmcpO3RoaXMuRWcoYSk7dGhpcy5lYz10aGlzLnZnKGEpO3RoaXMuWWI9e307dGhpcy5rZj0hMX0sRWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5zcyhhKSksdGhpcy5FZyhhLnBhcmVudCkpfSx2ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMudmcoYS5wYXJlbnQpKSwKYy5wdXNoKHRoaXMuJHIoYSkpKTtyZXR1cm4gY30sJHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHNzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlguZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuY2QmJmEuY2QuZXJyb3ImJmEuY2QuZXJyb3IuY29kZSYmKGI9YS5jZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LkdjLmNvZGU6Yj09RC5SZC5jb2RlP2UudyhrLkp4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpOihlLkdlKCksYj09RC5CZi5jb2RlJiZlLncoay5odSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Bcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuemYuY29kZTplLncoay5peCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQ2YuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5OeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS53KGsuUngsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7CmJyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudyhrLml1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMub2N8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkliKGEpO3RoaXMuTWEoKX0sSWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkxhLmxlbmd0aDspdHJ5e3ZhciBjPWEuTGEucG9wKCk7dGhpcy5FZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sVHY6ZnVuY3Rpb24oYSl7dGhpcy5mZT0KdGhpcy53ZT10aGlzLlNlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7dGhpcy5VbyYmdGhpcy5wbGF5ZXIuc2MoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnNjKCkvCjEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuUW8oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLk9oKGIpPyh0aGlzLlNvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy51cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLlJ2KCkpOnRoaXMuemUoKT90aGlzLkRoKCk6dGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0sUnY6ZnVuY3Rpb24oKXt0aGlzLmFjPXRoaXMuUGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuYWM9ITApO2UuJGYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4udGYmJmUuVG8odGhpcy5nLm9yaWdpbi50Zik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCxhKTt0aGlzLmIubWgoKTt0aGlzLmIuQ2MoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYi5DYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLnBmKCJ2cGFpZCIpO3RoaXMuYWMmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTsKdGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnVzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmFxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5ZZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkxiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmVjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMueHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYKKHRoaXMueXgoKSx0aGlzLmIuTGIoITApLCF0aGlzLkNiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLk5kPSEwO2UudyhrLiRoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnllKHRoaXMuQ2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5MYighMCksdGhpcy5DeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuTGIoITApLAp0aGlzLkd4KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSHgoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuYmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcubGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuYWcsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7CmEuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkJ4KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnp4KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLkF4KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5hYz0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5yZCwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYWM9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5tZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuWWQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSk7ZS5ZZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcykpO3RoaXMuYi5ObyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHp4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLlBkPSEwfSxBeDpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLlBkPSExfSxDeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEJ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHl4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuWWEoImltcHJlc3Npb24iKTtlLncoay5IZiwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sR3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sRXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEZ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLkpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5OZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxEeDpmdW5jdGlvbigpe3RoaXMuTGQoKTtlLllhKCJjb21wbGV0ZSIpfSwKYmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5NYShhKX19LHh4OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudyhrLkl4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7CnRoaXMuYmkoITApfSxRbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnhjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy5veC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sU286ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdGhpcy5NZC5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk1kLmJpbmQodGhpcykpfSxaaDpmdW5jdGlvbihhKXt0aGlzLkhifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGJ8fHRoaXMucWYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxxZjpmdW5jdGlvbihhKXtpZighdGhpcy5UYyYmdGhpcy5PaCh0aGlzLnZpZGVvKSYmIXRoaXMudmImJiF0aGlzLkhiKXt0aGlzLlRjPQohMDt0cnl7aWYoIWUuUWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudmJ8fCh0aGlzLnZiPSEwLHRoaXMueWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmpnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5NYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLm54KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQ2MoKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMuUmYoKTt0aGlzLmIubWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuY2YoKX19LGNmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmQpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJgooYT1hKGUuUGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMubGQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmxkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuTmMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTmMoKX1lbHNlIHRoaXMuTmMoKX0sTmM6ZnVuY3Rpb24oYSl7aWYodGhpcy5sZClmb3IodmFyIGI9MDtiPHRoaXMubGQubGVuZ3RoO2IrKyl0aGlzLmxkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmJkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5NYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkxlKCEwKSx0aGlzLk5jKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLndlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5TZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlFiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuUWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUWIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLlBjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5jZigpKX0uYmluZCh0aGlzKTt0aGlzLnBlKCkuQ2godGhpcyl9LExkOmZ1bmN0aW9uKCl7dGhpcy5ULnBjJiYhdGhpcy52YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLklvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5NYSgpfSxNYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSlpZih0aGlzLmZlPSEwLHRoaXMuTmR8fChlLncoay5sdSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5qYnx8dGhpcy5nLmNjKXtlLmdiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmJmKys7dGhpcy5IYj10aGlzLlRjPSExO3RyeXt0aGlzLnlkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5GZD0hMTt0cnl7dGhpcy5iLlVoKCl9Y2F0Y2goaCl7fXRoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5NYj0hMTt0aGlzLnBlKCkueGgoKTsKdGhpcy5nLmpiJiZ0aGlzLmcub3JpZ2luLk1lKCk7dGhpcy5nLmNjJiYoYT90aGlzLmcub3JpZ2luLmdoKCk6dGhpcy5nZSgpKX1lbHNlIHRoaXMuZ2UoKX0sb3g6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy55ZCh0aGlzLnZpZGVvKSx0aGlzLnplKCk/dGhpcy5EaCgpOnRoaXMuTWQoYSkpfSxNZDpmdW5jdGlvbihhKXt0aGlzLkhiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnplKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9jfHx0aGlzLlQuVmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZigpKTsKdGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0scmY6ZnVuY3Rpb24oKXtpZih0aGlzLkt3KXRoaXMuTWEoKTtlbHNle3RoaXMuTWI9ITA7dGhpcy5iLm0uUmEmJiF0aGlzLmRmJiZ0aGlzLmIubS5SYSgpJiZlLncoay4kYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5QdyhhKTtpZighdGhpcy5DYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5OZD0hMDtlLncoay4kaCx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UueWUodGhpcy5DYil9Yz0iIjt0aGlzLmcuYWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGM9dGhpcy5nLmFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkZkfHwodGhpcy5GZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5MZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5qYj8odGhpcy5IYj10aGlzLlRjPSExLHRoaXMueWQodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRmQ9ITEsdGhpcy5iLlVoKCksdGhpcy5nLm9yaWdpbi5NZSgpKTp0aGlzLk1hKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlJjLnJlcGxhY2UoIlt0aW1lXSIsZS50Zyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLlBjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMub2M9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkNjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlloLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMubWU9c2V0SW50ZXJ2YWwodGhpcy5qcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG5zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgueGMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LGpxOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5tZSksdGhpcy5MZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnJmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm1lKSx0aGlzLk1kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFJoOmZ1bmN0aW9uKCl7dGhpcy5saHx8KHRoaXMubGg9ITAsdGhpcy5lZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFB3OmZ1bmN0aW9uKGEpe2UudyhrLlhkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5TaHx8dGhpcy52Ynx8KDA9PWEmJih0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKSx0aGlzLlNlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLndlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlJoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5IZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5vYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULnBjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5lZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk5mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuU2g9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudmIpe3RyeXtpZih0aGlzLlliW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuWWIuaW1wcmVzc2lvbiYmdGhpcy5ZYi5jb21wbGV0ZSYmIXRoaXMua2Ype3RoaXMua2Y9ITA7dmFyIGM9dGhpcy5ZYi5jb21wbGV0ZS0KdGhpcy5ZYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmKDEwPmMmJihjPTEwKSwwPmMmJihjPSJuZWdhdGl2ZSIpLGUudHJhY2soZixjLCEwKSl9fWNhdGNoKGgpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9Yz1bXTt0cnl7Yz10aGlzLnRzKHRoaXMuZy5MYSxhKX1jYXRjaChsKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgbT1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5HZC5pbXByZXNzaW9ucyYmZS5rdChtLnVybCx0aGlzLkdkLmltcHJlc3Npb25zKT90aGlzLkVlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5Lbyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHthZElkOnRoaXMuR2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuRCgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKG0udXJsLG0udHlwZSl9Y2F0Y2gocil7fWlmKCFiKXRyeXt0aGlzLmcuTGE9dGhpcy5GcSh0aGlzLmcuTGEsYSl9Y2F0Y2gobil7fX19LEVlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuVC53YShhKSxjJiZhLlBvKGMpLGZ8fChmPXRoaXMuaWcpLHRoaXMuVC5IYShhLGYsdGhpcy5pZywhMSwhMCkpfSx0czpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LEZxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LG54OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLlloLmJpbmQodGhpcyl9LApZaDpmdW5jdGlvbigpe2UudyhrLmFnLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLmVkJiZlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLmFzKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5zYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5nLmxjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMuZy5sYyx0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKX19LmJpbmQodGhpcyksMjAwKX0sWGg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPQp0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuUmMucmVwbGFjZSgiW3RpbWVdIixlLnRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlQuVmMmJihiPXRoaXMuVC5WYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy50Yy5iaW5kKHRoaXMpLDFFMyoKYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSx0YzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy56cTt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5EZCgpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnVjKCk7dGhpcy50YygpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5QYjtjLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Pdy5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk53LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRGQoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy51YygpO3RoaXMudGMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLk9iO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTXcuYmluZCh0aGlzKSk6Zi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mdy5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2guaWQ9dGhpcy5HaDtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2guaW5uZXJIVE1MPSIiO2IuYXBwZW5kQ2hpbGQoYyk7dGhpcy5nLmFmJiZiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoZik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpOwp0aGlzLmNvbnRyb2xzPXRoaXMuamEuYXBwZW5kQ2hpbGQoYik7InZwYWlkIiE9YSYmdGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuTGUoKSk7dGhpcy51YygpfX0sdWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxEZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxOdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYi5ILnBhdXNlZD8odGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsCiEwKSxlLncoay5WZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT3c6ZnVuY3Rpb24oKXt0aGlzLlBkP2Uub2EodGhpcy5PLCJjb250cm9sIiwicGxheSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwicGF1c2UiKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmIuSC5wYXVzZWR8fCh0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5iLkgucGF1c2VkJiYodGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKSl9LEx3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWQ/KHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYi5ILm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudyhrLnJkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxNdzpmdW5jdGlvbigpe3RoaXMuYWM/ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJ1bm11dGUiKTplLm9hKHRoaXMuTywiY29udHJvbCIsIm11dGUiKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWR8fCh0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5yZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sJHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKTt0aGlzLmIuSC5tdXRlZCYmKHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LFFiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLAp0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5RYik7dGhpcy5iZHx8dGhpcy5QY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuY2YoKSl9LGdlOmZ1bmN0aW9uKCl7dGhpcy5iZD0hMDt0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKTtpZigoInByZXJvbGwiPT1lLlBhJiZ0aGlzLlBjfHwicG9zdHJvbGwiPT1lLlBhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlBhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkw7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5DYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwpjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5oZSgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLmhlKCl9ZWxzZSB0aGlzLmhlKCl9LApoZTpmdW5jdGlvbigpe3RoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5iLkJ2KCk7dGhpcy5NYj0hMTtlLncoay55cSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMucGUoKS54aCgpfSxwZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIubSYmKGE9dGhpcy5iLm0pO3JldHVybiBhfSx6ZTpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFJmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUueGUodGhpcy52aWRlbywKYSk/dGhpcy55aCgpOnRoaXMudGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuZy5sYyxhLmR1cmF0aW9uPXRoaXMuZy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuZy5qYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLmVjJiYwPHRoaXMuZWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLmVjKSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlhwKyItIit0aGlzLmJmO3RoaXMuZyYmdGhpcy5nLnpnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuZy56ZygpKTtyZXR1cm4gYX0saWc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBQPWMueWt8fFA7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5sPXRoaXMuYVsxXTt0aGlzLkJvPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVs5XTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLnp1PXRoaXMuYVs5XTt0aGlzLlFyPXRoaXMuYVszXTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzVdfWMua3U9YjtiLnByb3RvdHlwZT17TWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk5sOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Cbzp0aGlzLmZtKGEpfSxmbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ206dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhxOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56dTp0aGlzLlByKGEpfSxQcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXI6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5Mczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB3Yj1jLmt1fHx3Yix2ZD1uZXcgd2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT12ZC5NbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkJhPW51bGw7dGhpcy5aPVtdO3RoaXMuWD1udWxsO3RoaXMuZGM9dGhpcy5mYz0hMTt0aGlzLnRmPSIiO3RoaXMuc2Y9ITE7ZCYmZC5lbXB0eT90aGlzLll0KCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MuS249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmllKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHgodGhpcy51cmwpOmwud2EobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlFhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZXx8Yyl7YT1lLmRnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC53YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLndhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSJ9bC5IYShiLHRoaXMuWHQuYmluZCh0aGlzKSx0aGlzLlV0LmJpbmQodGhpcykpfSx3ZzpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuQmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlBhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChkKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGYpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5QYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUGF8fHRoaXMub3QoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwub3coKSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sb3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxYdDpmdW5jdGlvbihhKXt0aGlzLnJ2KGEpO3RyeXt0aGlzLkJhPWEucmVzcG9uc2VYTUwsdGhpcy5CYXx8KHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5OYSh3LlNkKSl9dGhpcy5aPXRoaXMud2coKTt0aGlzLmZjPXRoaXMuZ2YoKTt0aGlzLmRjPXRoaXMuTGgoKTt0aGlzLloubGVuZ3RoP3RoaXMuemMoKTp0aGlzLnJhKHRoaXMuTmEody5HYyx7ZXJyb3I6dGhpcy5zZj9ELlJkOkQuQWZ9KSl9LFl0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwKKHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk5hKHcuU2QpKX10aGlzLlo9dGhpcy53ZygpO3RoaXMuZmM9dGhpcy5nZigpO3RoaXMuZGM9dGhpcy5MaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy56YygpOnRoaXMucmEodGhpcy5OYSh3LkdjLHtlcnJvcjp0aGlzLnNmP0QuUmQ6RC5BZn0pKX0sVXQ6ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuTmEody56Zix7ZGVwdGg6YX0pKX0semM6ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5aLnNoaWZ0KCk7dGhpcy5xdCgpP3RoaXMueXcoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5GZygpLGcse0FkU3lzdGVtOnRoaXMuWnIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5yYSh0aGlzLk5hKHcuQ2YpKTooYT0wLHRoaXMuZXgoKSYmdGhpcy5RZSh0aGlzLkFxKCkpKX0sTWU6ZnVuY3Rpb24oKXt0aGlzLmZjPyh0aGlzLmZjPTE8dGhpcy5aLmxlbmd0aCwKdGhpcy5aLmxlbmd0aCYmdGhpcy56YygpKTp0aGlzLnBhcmVudC5NZSgpfSxnaDpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMuZGM9MTx0aGlzLloubGVuZ3RoLHRoaXMuWi5sZW5ndGgmJnRoaXMuemMoKSk6dGhpcy5wYXJlbnQuZ2goKX0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52dygpP3RoaXMudXcoKT8hMDooLTEhPXRoaXMucmMoKT90aGlzLnJhKHRoaXMuTmEody52ZikpOnRoaXMucmEodGhpcy5OYSh3LnpqKSksITEpOih0aGlzLnJhKHRoaXMuTmEody5HYyxELkJmKSksITEpfSxRZTpmdW5jdGlvbihhKXthLkxhPWEuTGEuY29uY2F0KHRoaXMuSWUoKSk7YS5qYj1hLmpiP2EuamI6dGhpcy5mYzthLmNjPWEuY2M/YS5jYzp0aGlzLmRjO3RoaXMucGFyZW50LlFlKGEpfSxBcTpmdW5jdGlvbigpe3ZhciBhPW5ldyB4YjthLmR1cmF0aW9uPXRoaXMucmMoKTthLlU9dGhpcy5DZygpO2EubGM9dGhpcy5icygpO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuWXIoKTthLmFmPXRoaXMucnMoYS5kdXJhdGlvbik7CnJldHVybiBhfSxyYTpmdW5jdGlvbihiKXt0aGlzLlgmJihiLkxhPWIuZXJyb3IuY29kZSE9dy52Zi5jb2RlP2IuTGEuY29uY2F0KHRoaXMuY3MoKSk6Yi5MYS5jb25jYXQodGhpcy5scygpKSk7dGhpcy5aLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkliJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuSWImJnRoaXMucGFyZW50LkliKGIpLGE9MCx0aGlzLnpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYiksYT0wKX0sSWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuSWIoYSl9LGtnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLk5hKGEsYikpfSxOYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB5YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LHl3OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sdnc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkNnKCkubGVuZ3RofSwKdXc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnJjKCl9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sTGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlomJjI8PXRoaXMuWi5sZW5ndGgmJiF0aGlzLmdmKCkmJihhPSEwKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxxdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LEZnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJBZFN5c3RlbSIpfSxJZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLlNnKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmJiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5TZyhhLnBhcmVudE5vZGUpOiExfSxsczpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LENnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksVWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHR5OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLAp1cmw6dGhpcy5iYihhW2NdKX0pO3RyeXt2YXIgZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksYj1kLmNvbmNhdChnKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz0KYj10aGlzLmpkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxyYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmJiKHRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scnM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5kdyhkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJgoib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmpkKGEpOiIifSxqZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5Lbnx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meT10aGlzLmFbNl07dGhpcy5acz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtleTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmZ5OnRoaXMuWXMoYSl9LFlzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5aczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMudml8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLmV5KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5VPVtdO3RoaXMubGM9IiI7dGhpcy5CPXRoaXMuY2M9dGhpcy5qYj0hMTt0aGlzLnRlPXRoaXMub3JpZ2luPW51bGx9Yy51bT1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxqczpmdW5jdGlvbigpe2lmKCF0aGlzLnRlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSwKYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnRlPWFbY10pfXJldHVybiB0aGlzLnRlfSx6ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5qcygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx1czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMudW18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVs0XTt0aGlzLldwPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzRdfWMuVnE9YjtiLnByb3RvdHlwZT17UGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFqOnRoaXMuVnAoYSl9LFZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XcDoKdGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYj1jLlZxfHxBYix4ZD1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT14ZC5Qaig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LHpqOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxHYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnRhOiJFTVBUWV9WQVNUIn0sQ2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHpmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp0YToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIix0YToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LGp5Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHRhOiJNRURJQUZJTEVfRVJST1IifSx2Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17QWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sbHk6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHRhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVnU9dGhpcy5hWzldO3RoaXMucWs9dGhpcy5hWzNdO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlF4PXRoaXMuYVs2XTt0aGlzLkF0PXRoaXMuYVsyXTt0aGlzLlBuPXRoaXMuYVsyXTt0aGlzLlhzPXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVszXTt0aGlzLm92PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzhdfWMuZ3k9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZ1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xazoKdGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuUHgoYSl9LFB4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ReDp0aGlzLnp0KGEpfSx6dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXQ6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBuOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Yczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm92OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgQmI9Yy5neXx8QmIseWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9eWQuVXUoNCk7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuY2Q9Yjt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Yaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHliPWMuWGp8fHliO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ5PXRoaXMuYVs1XTt0aGlzLlZ3PXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzldfWMudHQ9YjtiLnByb3RvdHlwZT17YXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ5OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIENiPWMudHR8fENiLHpkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT16ZC5heSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLm09YTt0aGlzLmFiPWEueGcoKTt0aGlzLkw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5MLmlkPWUuZ2EoMTApO3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkE9e307dGhpcy5iZT0hMTt0aGlzLm9iPVtdfWMuRmo9YjtiLnByb3RvdHlwZT17dWc6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxmPTAsYj0wLGU9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9Yi5sZWZ0LGI9Yi50b3ApO2U9e3g6ZiwKeTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudWcoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk5zKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYKKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodzpmdW5jdGlvbigpe3RoaXMuYmU9ITB9LFVoOmZ1bmN0aW9uKCl7dGhpcy5IPUMucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkguaWQ9ImFkWGRpc3BsYXkiLHRoaXMuSC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxtaDpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLiRjLHRoaXMubS52KCkpfSxCdjpmdW5jdGlvbigpe3RoaXMuYmV8fCh0aGlzLm0ucGxheSgpLGUudyhrLmFkLHRoaXMubS52KCkpKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMubS5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0KImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5MLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5MLnN0eWxlLmJveFNpemluZz10aGlzLmFiLnN0eWxlLmJveFNpemluZzt0aGlzLkwuc3R5bGUud2lkdGg9dGhpcy5hYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmFiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5hYik7dGhpcy5tLlJiJiZ0aGlzLm0uUmIoKT90aGlzLm0ueGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMubS5leGl0RnVsbHNjcmVlbigpfSwKTnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG1nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZyh0aGlzLmFiKTtpZihiLnghPXRoaXMuQS54fHxiLnkhPXRoaXMuQS55fHxiLnBvc2l0aW9uIT10aGlzLkEucG9zaXRpb258fGIud2lkdGghPXRoaXMuQS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuQS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5BLndpZHRoJiYKMDx0aGlzLkEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZSgpO3JldHVybn10aGlzLkE9Yjt0aGlzLm0uUmIoKT8odGhpcy5MLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5MLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuTC5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9iLmxlbmd0aDthKyspdGhpcy5vYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkhoKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTGIuYmluZCh0aGlzKSwxMCl9LE5vOmZ1bmN0aW9uKGEpe3RoaXMub2J8fAoodGhpcy5vYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMub2IucHVzaChhKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLkwmJnRoaXMuTC5wYXJlbnROb2RlJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5MKTt0aGlzLkgmJnRoaXMuSC5wYXVzZSYmdGhpcy5ILnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLkZqfHxPLEM9W10sRGI9MDsxMDA+RGI7RGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUuZ2EoMTApO0wuY29udHJvbHM9ITA7Qy5wdXNoKEwpfXZhciBIPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCnopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlN1PXRoaXMuYVsxXTt0aGlzLlh2PXRoaXMuYVs3XTt0aGlzLmdxPXRoaXMuYVs3XTt0aGlzLmVwPXRoaXMuYVsxXTt0aGlzLmZrPXRoaXMuYVs2XTt0aGlzLkV3PXRoaXMuYVs3XTt0aGlzLnF2PXRoaXMuYVs1XTt0aGlzLk1qPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuTXM9YjtiLnByb3RvdHlwZT17UnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlN1OnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mazp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkV3OnRoaXMucHYoYSl9LHB2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xdjp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYj1jLk1zfHxFYixBZD1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1BZC5SdSg0KTsoZnVuY3Rpb24oYyl7Yy5rbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWQoYik7CnRoaXMuZ2coKX0sQWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuRmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBGYj1jLmttfHxGYjsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkdiPXRoaXMuR2J8fCExO3RoaXMuSWY9dGhpcy5LZj10aGlzLk9nPXRoaXMucWE9dGhpcy5sZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcihhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubGY9ITA7dGhpcy5PZyYmdGhpcy5aZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnNiO2EmJmEuTWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5XYygpO3RoaXMuT2c9ITA7dGhpcy5aZigpfS5iaW5kKHRoaXMpKTt0aGlzLlRmKCl9LFpmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2Ipe3RoaXMuV2MoKTtpZighdGhpcy5sZiYmIXRoaXMuV2MoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5sZiYmdGhpcy5JZiYmIXRoaXMuS2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxXYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sRGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sVGY6ZnVuY3Rpb24oKXtpZih0aGlzLldjKCkpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5LZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLklmPWIucXl9dGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRmKCl9LmJpbmQodGhpcyksMTAwKX0sdXk6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuR3koKTohMX0scmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnJjKCk6LTF9LG1zOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElyOmZ1bmN0aW9uKGIsYSl7dGhpcy5HYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkdifHwzMDI9PXRoaXMuR2I/dGhpcy5xYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuR2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT8odGhpcy5zKCksdGhpcy5lYSgpKTpiLm9kKCk/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXMoYik/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgR2I9Yy5qbXx8R2I7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxudDpmdW5jdGlvbigpe3dpbmRvdy5PTy5DbS56by54bz93aW5kb3cuT08uQ20uem8ueG8ub3koZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuT2EoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEZiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBHYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgSGI9Yy5sbXx8SGIsSWI9bmV3IEhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml5PXRoaXMuYVszXTt0aGlzLlRsPXRoaXMuYVs2XTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLmdyPXRoaXMuYVs2XTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzddfWMuR2k9YjtiLnByb3RvdHlwZT17aHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml5OnRoaXMuU2woYSl9LApTbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGw6dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncjp0aGlzLmhyKGEpfSxocjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaXI6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYj1jLkdpfHxKYixCZD1uZXcgSmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1CZC5oeSg0KTsoZnVuY3Rpb24oYyl7Yy5paj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuR2coKX0sR2c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmCihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKbGE6ZnVuY3Rpb24oKXt0aGlzLnNoKCl9LHNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5OJiYoMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgS2I9Yy5panx8S2I7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sVWY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy5zKCJlbXB0eSIpLHRoaXMuZWEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5lYSgpOnRoaXMudSgpKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuVWYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5oanx8TGI7KGZ1bmN0aW9uKGMpe2Muamo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8CihiLkFkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLksoYiksKG5ldyBMYihiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLktyfHwodGhpcy5Lcj0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMudmgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5qanx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkV1PXRoaXMuYVsxXTt0aGlzLnRuPXRoaXMuYVs5XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs4XTt0aGlzLmt4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVs5XX1jLkJwPWI7Yi5wcm90b3R5cGU9e0R1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudG46dGhpcy5WaihhKX0sVmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xajp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTXI6dGhpcy5qeChhKX0sang6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5CcHx8TmIsQ2Q9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPUNkLkR1KDQpOyhmdW5jdGlvbihjKXtjLmVuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7CnZhciBXPWMuZW58fFc7KGZ1bmN0aW9uKGMpe2MuZG49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5RZigiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuUWYoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5xdShhKX0uYmluZCh0aGlzKSk7eS5FcygpfSxxdTpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLnMoKTt0aGlzLmVhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPwohMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBYPWMuZG58fFg7KGZ1bmN0aW9uKGMpe2MuZm49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuc2QmJihiPWUuS3EoYix0aGlzLnNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFcoZCk7CmlmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuc2R8fCh0aGlzLnNkPVtdKSx0aGlzLnNkLnB1c2goYlthXSksZD1uZXcgVyhoKSx0aGlzLkooZCl8fCh0aGlzLksoZCksZj1uZXcgWChkLHRoaXMuRyksZi5jKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxRZjpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSx6dzpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYKIXRoaXMuZGFbYV0pdGhpcy55Y3x8KHRoaXMueWM9W10pLHRoaXMueWMucHVzaChiKSx0aGlzLkF2KCkmJih0aGlzLnpkKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEVzOmZ1bmN0aW9uKCl7aWYodGhpcy55Yylmb3IodmFyIGI9MDtiPHRoaXMueWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy55Y1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmRhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5kYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lnp3KGIpfX0pfSkoYyk7dmFyIE9iPWMuZm58fE9iLHk9bmV3IE9iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWs9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzhdO3RoaXMuU209dGhpcy5hWzFdO3RoaXMuZnY9dGhpcy5hWzFdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuRXI9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzddO3RoaXMuVWk9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtsazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWs6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hdzp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZ2OnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydzp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU3E6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVyOnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5SdDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYj1jLnNqfHxQYixEZD1uZXcgUGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KRGQubGsoNCk7KGZ1bmN0aW9uKGMpe2MuZWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLmVqfHxRYjsoZnVuY3Rpb24oYyl7Yy5maj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMucygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUmI9Yy5manx8UmI7KGZ1bmN0aW9uKGMpe2MuZ2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgUWIoZCk7dGhpcy5KKGUpfHwodGhpcy5LKGUpLChuZXcgUmIoZSx0aGlzLkcpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5nanx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRpPXRoaXMuYVsyXTt0aGlzLnVwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzJdfWMuanI9YjtiLnByb3RvdHlwZT17Q2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYj1jLmpyfHxVYixFZD1uZXcgVWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1FZC5DaSg0KTsoZnVuY3Rpb24oYyl7Yy5YbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlMoYik7dGhpcy5WKGEpO3RoaXMudHYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdHY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiYKdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFBnOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIFZiPWMuWGx8fFZiOyhmdW5jdGlvbihjKXtjLldsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5laT0hMX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5laSYmKHRoaXMuRigpLHRoaXMuZWk9ITAsdGhpcy5LYSgpKTthLkZhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRigpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBXYj1jLldsfHxXYjsoZnVuY3Rpb24oYyl7Yy5ZbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBWYihiW2RdKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBXYihjLHRoaXMuRykpLmMoKSl9fWVsc2UgdGhpcy5JKCl9fSl9KShjKTt2YXIgWGI9Yy5ZbHx8WGIsWT1uZXcgWGIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWo9dGhpcy5hWzZdO3RoaXMueXA9dGhpcy5hWzJdO3RoaXMuQ3E9dGhpcy5hWzddO3RoaXMua2s9dGhpcy5hWzFdO3RoaXMuQm09dGhpcy5hWzhdO3RoaXMuWXg9dGhpcy5hWzVdO3RoaXMueWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuRnQ9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklqOnRoaXMueHAoYSl9LAp4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuQnEoYSl9LEJxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DcTp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua2s6dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJtOnRoaXMuWHgoYSl9LFh4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ZeDp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYj1jLkZ0fHxZYixGZD1uZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1GZC5Iaig0KTsoZnVuY3Rpb24oYyl7Yy5Sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgWmI9Yy5Sbnx8WmI7KGZ1bmN0aW9uKGMpe2MuUW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sSmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5XYXx8KHRoaXMuV2E9W10pO3RoaXMuV2EucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5lYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLmdjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxjOmZ1bmN0aW9uKCl7dGhpcy51KCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnhhP3RoaXMuc3YodGhpcy54YSk6KHRoaXMueGE9dGhpcy5KYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCkpfSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnhhKXt0aGlzLkYoKTtyZXR1cm59aWYoIXRoaXMuZ2Mpe3RoaXMuRigpO3JldHVybn1iPSEwO2lmKHRoaXMuV2EmJgp0aGlzLldhLmxlbmd0aCYmMTx0aGlzLldhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuV2EubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuV2FbYV0mJjMwMyE9dGhpcy5XYVthXSYmNDAzIT10aGlzLldhW2FdJiYoYj0hMSk7aWYoYil0aGlzLnMoImVtcHR5IiksdGhpcy5lYSgpO2Vsc2V7dGhpcy5GKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgJGI9Yy5Rbnx8JGI7KGZ1bmN0aW9uKGMpe2MuU249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5JYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBaYihiLml0ZW0oYSkpO3RoaXMuSihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSyhjKSwKKG5ldyAkYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgYWM9Yy5Tbnx8YWMsYmM9bmV3IGFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl1PXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs2XTt0aGlzLkN0PXRoaXMuYVsxMF07dGhpcy5wcj10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuYXI9dGhpcy5hWzFdO3RoaXMuaXY9dGhpcy5hWzldO3RoaXMudXI9dGhpcy5hWzZdO3RoaXMuZ3A9dGhpcy5hWzZdO3RoaXMucnI9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudXQ9YjtiLnByb3RvdHlwZT17SHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkl1OnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HdTp0aGlzLkJ0KGEpfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Q6dGhpcy5vcihhKX0sCm9yOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wcjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFyOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pdjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXI6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdwOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNjPWMudXR8fGNjLEdkPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUdkLkh1KDQpOyhmdW5jdGlvbihjKXtjLmJsPQpuLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTiYmKDAsdGhpcy5OKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBkYz0KYy5ibHx8ZGM7KGZ1bmN0aW9uKGMpe2MuYWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5yZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NbygpfS5iaW5kKHRoaXMpKSx0aGlzLmRpPSExLHRoaXMuS3g9MUUzLAp0aGlzLm9oPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxyZzpmdW5jdGlvbigpe3RoaXMub2guZG9uZXx8KHRoaXMub2guZG9uZT0hMCx0aGlzLmRpPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jaSgpfS5iaW5kKHRoaXMpLHRoaXMuS3gpKX0sTW86ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGkpO3RoaXMucygpfSxjaTpmdW5jdGlvbigpe3RoaXMueWEoKT8odGhpcy5zKCksdGhpcy5lYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRigpKX0sQWc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5BZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLkFnKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBlYz1jLmFsfHxlYzsoZnVuY3Rpb24oYyl7Yy5jbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuT2Eod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGRjKGMpLHRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IGVjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGZjPWMuY2x8fGZjLGdjPW5ldyBmYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW49dGhpcy5hWzhdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMuTXg9dGhpcy5hWzddO3RoaXMucmw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudnU9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbTp0aGlzLkx4KGEpfSxMeDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXg6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgaGM9Yy52dXx8aGMsSGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLlRuKDQpOyhmdW5jdGlvbihjKXtjLmJuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBpYz1jLmJufHxpYzsoZnVuY3Rpb24oYyl7Yy5hbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMua2MoKX0sa2M6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5DZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2MoKX0uYmluZCh0aGlzKSwxMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LAp1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5hbnx8amM7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBpYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgamMoYiwKdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLmNufHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbOV19Yy5paT1iO2IucHJvdG90eXBlPXtPbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmlpfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5PbCg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuUmU9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLll1KCl9LmJpbmQodGhpcyksNTAwKX0sWXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuUmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuUmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxldzpmdW5jdGlvbigpe3RoaXMuUmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLk5tfHxuYzsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuJGI9MH0sYzpmdW5jdGlvbigpe3RoaXMuY3U9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy4kYnx8KHRoaXMuJGI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy4kYnx8dGhpcy4kYisrLHRoaXMuJGI8PXRoaXMuY3U/KHRoaXMuJGIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmV3KCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgb2M9Yy5NbXx8b2M7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBwYz1jLk9tfHxwYyxxYz1uZXcgcGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHA9dGhpcy5hWzhdO3RoaXMuV249dGhpcy5hWzhdOwp0aGlzLm14PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLmR4PXRoaXMuYVs2XTt0aGlzLmZ0PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLnl0PXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMubnc9YjtiLnByb3RvdHlwZT17Q3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Xbjp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubXg6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFpOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5keDp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRyOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgcmM9Yy5ud3x8cmMsSmQ9bmV3IHJjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9SmQuQ3AoNCk7KGZ1bmN0aW9uKGMpe2MuS209bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLk4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgc2M9Yy5LbXx8c2M7KGZ1bmN0aW9uKGMpe2MuSm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7CmEmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuS2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52cSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmdkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5TdCgpOnRoaXMua2MoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSx2cTpmdW5jdGlvbigpe3RoaXMuR2YoKXx8dGhpcy51KCEwKX0sU3Q6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZCgpOyFiLnZhJiZiLlomJmIubnkmJmIucHkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfSxrYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtjKCl9LmJpbmQodGhpcyksMTAwKX0sZ2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5raClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKS5pZCwKYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLmtoPWJbY10pO3JldHVybiB0aGlzLmtofSxDZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSx1OmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5nZCgpLmFkc0xvYWRlcj90aGlzLkYoITApOnRoaXMuRigpOnRoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB0Yz1jLkptfHx0YzsoZnVuY3Rpb24oYyl7Yy5MbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBzYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IHRjKGMsdGhpcy5HKSkuYygpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIHVjPWMuTG18fHVjLHZjPW5ldyB1YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbM107dGhpcy5oaT10aGlzLmFbMTBdO3RoaXMuWW89dGhpcy5hWzEwXTt0aGlzLlF1PXRoaXMuYVsxMF07dGhpcy53dD10aGlzLmFbNV07dGhpcy5IbT10aGlzLmFbN107dGhpcy5NdT10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsyXX1jLkF3PWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWk6dGhpcy5naShhKX0sZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhpOnRoaXMuWG8oYSl9LApYbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWW86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlF1OnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53dDp0aGlzLkdtKGEpfSxHbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSG06dGhpcy5MdShhKX0sTHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5NdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHdjPWMuQXd8fHdjLEtkPW5ldyB3YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUtkLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKRSYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuVihhKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYjpmdW5jdGlvbigpe3JldHVybiEwfSxGYTpmdW5jdGlvbigpe3ZhciBiO0U/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFo9Yy52bHx8WjsoZnVuY3Rpb24oYyl7Yy51bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5UZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlRlPWIuaWQpO0U/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlRlJiZiIT10aGlzLlRlfHwiYWRlcnJvciIhPWEuZXZlbnR8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm8oImFkZXJyb3IiLGEuSXkpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYWE9Yy51bHx8YWE7KGZ1bmN0aW9uKGMpe2Mud2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihFKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFooYiksYi5tYXx8dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBaKGIpLGIubWE/dGhpcy56ZCgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEUseGM9Yy53bHx8eGMseWM9bmV3IHhjKGZ1bmN0aW9uKGMsYil7Yy5wYXVzZSgpO2lmKGwueWIubGVuZ3RoKXt2YXIgYT1sLnliLnNoaWZ0KCk7CmlmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9ZS5Pdih7IltMT0FEU0NSSVBUXSI6ZS5nYSgxMCksIltVVElMU10iOmUuZ2EoMTApLCJbQ0FMTEJBQ0tdIjplLmdhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS5haC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuYWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHEoYyxiKX1lbHNlIHEoYyxiKX0pO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ4PXRoaXMuYVs4XTt0aGlzLlJ3PXRoaXMuYVs4XTt0aGlzLmt3PQp0aGlzLmFbMl07dGhpcy5lbz10aGlzLmFbNV07dGhpcy50bT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs5XX1jLlJrPWI7Yi5wcm90b3R5cGU9e1V4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WeDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnc6dGhpcy5pdyhhKX0saXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmt3OnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lbzp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudG06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yz1jLlJrfHx6YyxMZD1uZXcgemMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1MZC5VeCg0KTsoZnVuY3Rpb24oYyl7Yy54bj0Kbi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlYoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmd1PWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxPeTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiYKYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuTiYmdGhpcy5OKCkpfX0pfSkoYyk7dmFyIE09Yy54bnx8TTsoZnVuY3Rpb24oYyl7Yy53bj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8KHRoaXMudGI9MCksdGhpcy50YisrLDE1PHRoaXMudGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuUXYoKToKdGhpcy51KCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5uZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTj1jLndufHxOOyhmdW5jdGlvbihjKXtjLnluPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSkpO3RoaXMuemQoKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnlufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHI9CnRoaXMuYVsxMF07dGhpcy5FcT10aGlzLmFbN107dGhpcy5uaj10aGlzLmFbMl07dGhpcy53aj10aGlzLmFbNF07dGhpcy51aj10aGlzLmFbMV07dGhpcy53cD10aGlzLmFbNl07dGhpcy5CaT10aGlzLmFbMTBdO3RoaXMubXY9dGhpcy5hWzddO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMV19Yy5Gaz1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHI6dGhpcy5EcShhKX0sRHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5FcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmo6dGhpcy52aihhKX0sdmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53ajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndwOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CaToKdGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5MbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIENjPWMuRmt8fENjLE1kPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU1kLmtyKDQpOyhmdW5jdGlvbihjKXtjLm9sPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmVnPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuZmEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVnfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTj8oMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7YnE6ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5lZz1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7YnE6ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpOwp2YXIgRGM9Yy5vbHx8RGM7KGZ1bmN0aW9uKGMpe2Mubmw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTXk6ZnVuY3Rpb24oKXt9LHZ2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWYobmV3IGZ1bmN0aW9uKCl7fSk7YS5reT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi52dihhKTt3aW5kb3cuYmU9Yn0sYzpmdW5jdGlvbigpe3RoaXMudXZ8fCh0aGlzLnV2PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmV8fCh0aGlzLnZlPTEpO2lmKDIwPHRoaXMudmUpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmCihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuU2EoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy52ZSsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTApfX0sU2E6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLm8oImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlkoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LAp1OmZ1bmN0aW9uKGIpe3RoaXMuRihiKX19KX0pKGMpO3ZhciBFYz1jLm5sfHxFYzsoZnVuY3Rpb24oYyl7Yy5wbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgRGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLm1hfHx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBFYyhjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRmM9Yy5wbHx8RmMsR2M9bmV3IEZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Iaz10aGlzLmFbNF07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5SbD10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy4kcz1iO2IucHJvdG90eXBlPXtHazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGs6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZzOnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pajp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUmw6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy4kc3x8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPU5kLkdrKDQpOyhmdW5jdGlvbihjKXtjLmZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuZmx8fGJhOyhmdW5jdGlvbihjKXtjLmRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLkxnPTA7dGhpcy5XPXRoaXMuV3x8ITE7CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnZjPXRoaXMueGE9dGhpcy5TYz0hMTt0aGlzLnVoPWUud2IoMTApO3RoaXMuVWcoKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlNhKCksITA7dGhpcy5MZysrO2lmKDEwPHRoaXMuTGcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5VZy5iaW5kKHRoaXMpLDEwMCksITF9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52YTtpZihiKXt2YXIgYT0iYWRFcnJvciIsCmM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApOwp0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmCmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGNhPWMuZGx8fGNhOyhmdW5jdGlvbihjKXtjLmdsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBJYz1jLmdsfHxJYyxKYz0KbmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk9yPXRoaXMuYVsyXTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnpuPWI7Yi5wcm90b3R5cGU9e05yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Pcjp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBLYz1jLnpufHxLYyxPZD1uZXcgS2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1PZC5Ocig0KTsoZnVuY3Rpb24oYyl7Yy5haz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIExjPWMuYWt8fExjOyhmdW5jdGlvbihjKXtjLiRqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLAp0aGlzLnUoKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIE1jPWMuJGp8fE1jOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLk9hKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgTGMoZCksZC5tYXx8dGhpcy5KKGQpfHwodGhpcy5LKGQpLChuZXcgTWMoZCx0aGlzLkcpKS5jKCkpOwplbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5jPWMuYmt8fE5jLE9jPW5ldyBOYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbOV07dGhpcy5Hdz10aGlzLmFbNl07dGhpcy5udT10aGlzLmFbOF07dGhpcy5Gdj10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbNF07dGhpcy5GaT10aGlzLmFbNV07dGhpcy5kaj10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbMl07dGhpcy5YcT10aGlzLmFbNF07dGhpcy5pbD10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLnhyPWI7Yi5wcm90b3R5cGU9e0NsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EbDp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3c6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm51OnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuRnY6dGhpcy5icihhKX0sYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZGo6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpzOnRoaXMuV3EoYSl9LFdxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5YcTp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYz1jLnhyfHxQYyxQZD1uZXcgUGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1QZC5DbCg0KTsoZnVuY3Rpb24oYyl7Yy5oaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5WKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgUWM9Yy5oa3x8UWM7KGZ1bmN0aW9uKGMpe2MuZ2s9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuV2YoKX0sV2Y6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldmKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgUmM9Yy5na3x8UmM7KGZ1bmN0aW9uKGMpe2MuaWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFFjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSihiKSl7dGhpcy5LKGIpOyhuZXcgUmMoYix0aGlzLkcpKS5jKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBTYz1jLmlrfHxTYyxUYz1uZXcgU2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnE9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLnVpPQp0aGlzLmFbNF07dGhpcy53cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs1XX1jLiRrPWI7Yi5wcm90b3R5cGU9e01xOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnE6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLiRrfHxVYyxRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5NcSg0KTsoZnVuY3Rpb24oYyl7Yy5taT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTsKYj8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLmZhKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIFZjPWMubWl8fFZjOyhmdW5jdGlvbihjKXtjLmxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuY2UoKTt0aGlzLlNmKCl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMDt0aGlzLnMoImVtcHR5IHZhc3QiKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlNmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5jZS5iaW5kKHRoaXMpLDEwMCl9LGNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKInBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2EuYmluZCh0aGlzKSwxMCksdGhpcy5zKCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy51KCk6dGhpcy51KCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNlLmJpbmQodGhpcyksMTAwKX19LHU6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5LYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMubGl8fFdjOyhmdW5jdGlvbihjKXtjLm5pPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuSSgpfX0pfSkoYyk7dmFyIFhjPWMubml8fFhjLFljPW5ldyBYYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obz10aGlzLmFbNF07dGhpcy5vbT10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbOV07dGhpcy5lbT10aGlzLmFbNV07dGhpcy5FbT10aGlzLmFbOF07dGhpcy5Ebj10aGlzLmFbM107dGhpcy4kcD10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkltPWI7Yi5wcm90b3R5cGU9e2ZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaG86dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5vbTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnE6dGhpcy5kbShhKX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVtOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FbTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG46dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgWmM9Yy5JbXx8WmMsUmQ9bmV3IFpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UmQuZm8oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuV2c9dGhpcy5ZZz10aGlzLlhnPSExO3RoaXMudWQ9W107dGhpcy5XZT0Ke0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdmM/bnVsbDp2YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBCYz9udWxsOkJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeWM/bnVsbDp5YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgT2M/bnVsbDpPYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHFjP251bGw6cWMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJiP251bGw6cmIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhPwpudWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT9udWxsOll9fWMud209YjtiLnByb3RvdHlwZT17YzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5vcyhhKTpbXSxiO3RoaXMuWWc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuemgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLldnKWJyZWFrO2I9dGhpcy5XZVtjXTt0aGlzLm9mKGIpJiYodGhpcy51ZC5wdXNoKGIpLHRoaXMuemgoYikpfX0sb2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxvczpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPQowO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5vZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLm9mKGEpJiZhLmMoKX0sZnc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJiF0aGlzLlhnKWZvcih0aGlzLldnPSEwLGE9MDthPHRoaXMudWQubGVuZ3RoO2ErKyl0aGlzLnVkW2FdLkFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWRbYV0uQWIpfX19KShjKTt2YXIgJGM9Yy53bXx8JGMsSz1uZXcgJGM7Sy5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2k9dGhpcy5hWzldO3RoaXMuJGw9dGhpcy5hWzEwXTt0aGlzLk1rPXRoaXMuYVsxMF07dGhpcy5UeD10aGlzLmFbMl07dGhpcy5idD10aGlzLmFbOV07dGhpcy5xeD10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsxXX1jLlFtPWI7Yi5wcm90b3R5cGU9CntOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Nazp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMucHgoYSl9LHB4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGFkPWMuUW18fGFkLFNkPW5ldyBhZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLk5pKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnFjKGsuZngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnFjKGsuanUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIFRkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry53YygpO0cuUWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLndjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5RZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cud2MoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLnFnKHdpbmRvdyxHLmd0KCkse2lkOlVkfSl9LDUwMCksbGE9ZS5nYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbNl07dGhpcy5hdT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMucHU9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMubD0KdGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17dGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVrOnRoaXMuJHQoYSl9LCR0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5hdTp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm46dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnB1OnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55czp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLmR1fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucmg9CnRoaXMuY29uZj10aGlzLmViPXRoaXMucGxheWVyPW51bGw7dGhpcy5wZD0wO3RoaXMuVmE9IiI7dGhpcy52ZD1bXTt0aGlzLndkPTA7dGhpcy50aD0hMTt0aGlzLlVlPVtdO2UuZ2IoIm5ld0FkZGVsaXZlcnkiKX1jLnJpPWI7Yi5wcm90b3R5cGU9e052OmZ1bmN0aW9uKGEpe3RoaXMucmg9YX0sQmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlZhPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxJdjpmdW5jdGlvbihhKXt0aGlzLmViPWF9LEh2OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVmFdJiZ0aGlzLmNvbmZbdGhpcy5WYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlZhXVthXSk7cmV0dXJuIGJ9LEJjOmZ1bmN0aW9uKGEsYil7ZS51Yigid2VsdC5kZSIpJiZlLlVhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmh0KCkpdGhpcy5lYi5mKHRoaXMuZWIua2QsdGhpcy5lYi5DYSx0aGlzLmViLlZlLGZ1bmN0aW9uKCl7dGhpcy5CYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIubmMpO2Vsc2UgaWYodGhpcy5HcygpKXRoaXMuR3YoZnVuY3Rpb24oKXt0aGlzLkJjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLncoay4kYyx0aGlzLnBsYXllci52KCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBPKHRoaXMuZ2V0UGxheWVyKCksaCk7YiYmbC5odygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLmdiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBQKGwsdGhpcy5lYixoKTtsLkJoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5idShhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxodDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnBkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMucGQuZ2V0VGltZSgpLHRoaXMucGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnBkPWE7cmV0dXJuITF9LFp2OmZ1bmN0aW9uKCl7ZS5nYigicHJlcm9sbCIpOwplLiRlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGcoYSkpP3RoaXMuQmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX0sWXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuJGUoInBvc3Ryb2xsIik7ZS5nYigicG9zdHJvbGwiKTt0aGlzLk52KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmxnKGMpKT90aGlzLkJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX19LGxnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx4djpmdW5jdGlvbigpe3RoaXMucGxheWVyLlN2KHRoaXMuWXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sRWQ6ZnVuY3Rpb24oYSl7ZS5nYigibWlkcm9sbCIpO2UuJGUoIm1pZHJvbGwiKTtpZighdGhpcy5kaCl7dGhpcy5kaD0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5CYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS53KGsuYWQsdGhpcy5wbGF5ZXIudigpKSl9fSx3djpmdW5jdGlvbigpe3RoaXMucGxheWVyLk12KHRoaXMuRWQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSmUoKX0sYzpmdW5jdGlvbigpe3RoaXMuWnYoKTt0aGlzLnBsYXllci5KZSYmdGhpcy53digpO3RoaXMueHYoKX0seXY6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy52ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3goYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLndkPXRoaXMudmQubGVuZ3RofSxHczpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMud2QmJihhPSEwKTtyZXR1cm4gYX0sR3Y6ZnVuY3Rpb24oYSl7dGhpcy50aD1hO2ZvcihhPTA7YTx0aGlzLnZkLmxlbmd0aDthKyspdGhpcy52ZFthXVsiZnVuY3Rpb24iXSh0aGlzLmN2LmJpbmQodGhpcykpfSxjdjpmdW5jdGlvbihhKXt0aGlzLndkLS07YSYmdGhpcy5VZS5wdXNoKGEpOzA+PXRoaXMud2QmJnRoaXMudGgoKX0sYnU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVWUubGVuZ3RoO2MrKyliPXRoaXMuVWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMucml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzFdO3RoaXMuZXI9dGhpcy5hWzNdO3RoaXMuc2s9dGhpcy5hWzldOwp0aGlzLkdyPXRoaXMuYVszXTt0aGlzLk9wPXRoaXMuYVs3XTt0aGlzLlFxPXRoaXMuYVsyXTt0aGlzLlFrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuY209YjtiLnByb3RvdHlwZT17R286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhvOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2k6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJuOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5lcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2s6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdyOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcDp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXE6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5Razp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNkPWMuY218fGNkLFdkPW5ldyBjZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVdkLkdvKDQpfSkuY2FsbChPb3RhZWxvb3llZWJhWmVlLE9vdGFlbG9veWVlYmFaZWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.94.77 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.77.94.243.136.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:16 GMT
Last-Modified
Wed, 24 Apr 2019 07:48:14 GMT
Server
openresty/1.13.6.2
ETag
"5cc014be-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 0262
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ca18ecebfef618d82aa834ac387bf9ad0ef34232d4eb3618005b4e3542af81b9

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
text/javascript
pd
eu-u.openx.net/w/1.0/ Frame 3DD2
Redirect Chain
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
173.241.240.143 Amsterdam, Netherlands, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-143.xa.dc.openx.org
Software
OXGW/16.139.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
accept-encoding
gzip, deflate, br
cookie
i=501ccd73-7871-08a9-0b15-f64404a5edde|1557932416
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

status
200
vary
Accept
set-cookie
i=501ccd73-7871-08a9-0b15-f64404a5edde|1557932416; Version=1; Expires=Thu, 14-May-2020 15:00:18 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1557932418|mOgikimWiygu; Version=1; Expires=Thu, 30-May-2019 15:00:18 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.139.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Wed, 15 May 2019 15:00:18 GMT
content-type
text/html
content-encoding
gzip

Redirect headers

status
302
set-cookie
i=501ccd73-7871-08a9-0b15-f64404a5edde|1557932416; Version=1; Expires=Thu, 14-May-2020 15:00:16 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.139.0
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Wed, 15 May 2019 15:00:16 GMT
content-length
0
index.html
cdn.districtm.io/ids/ Frame F4BF
0
0
Document
General
Full URL
https://cdn.districtm.io/ids/index.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:30::681c:13e8 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash

Request headers

:method
GET
:authority
cdn.districtm.io
:scheme
https
:path
/ids/index.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

status
200
date
Wed, 15 May 2019 15:00:17 GMT
content-type
text/html
set-cookie
__cfduid=d265d3499cd906daf01704e42a3bff87b1557932417; expires=Thu, 14-May-20 15:00:17 GMT; path=/; domain=.districtm.io; HttpOnly
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
cache-control
s-maxage=1209600, max-age=14400
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server
cloudflare
cf-ray
4d75fb06797e96e0-FRA
content-encoding
br
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame F569
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.215.51 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-215-51.deploy.static.akamaitechnologies.com
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Server
nginx/1.9.13
Content-Type
text/html
Vary
Accept-Encoding
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Content-Length
506
Cache-Control
max-age=31536000
Expires
Thu, 14 May 2020 15:00:17 GMT
Date
Wed, 15 May 2019 15:00:17 GMT
Connection
keep-alive
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame E54B
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.215.51 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-215-51.deploy.static.akamaitechnologies.com
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Server
nginx/1.9.13
Content-Type
text/html
Vary
Accept-Encoding
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Content-Length
506
Cache-Control
max-age=31536000
Expires
Thu, 14 May 2020 15:00:17 GMT
Date
Wed, 15 May 2019 15:00:17 GMT
Connection
keep-alive
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame AB5A
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.215.68 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-215-68.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.com
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Last-Modified
Thu, 25 Apr 2019 07:31:59 GMT
ETag
"13006b6-a159-58755d04349cb"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
15468
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=128409
Expires
Fri, 17 May 2019 02:40:26 GMT
Date
Wed, 15 May 2019 15:00:17 GMT
Connection
keep-alive
Vary
Accept-Encoding
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/ME3DIjPBALlnFEUkzFnBPwAAAAAAAABwNQAPBAAFAAwNQTUOaAZGAAOA55A55A85B55A58E55A55AFA22A0xA2BErUOaAPtJAAAAAAAIZyOAPAAAAAAAAAIUOaASksF/FjAAAAAAAAAAAAEAAAwNQAAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A1AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFyBEdAAAAAAAAAAAAFAAAUOaAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF9HO1SA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.2.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h220.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:16 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 15-May-19 15:00:15 GMT
/
ssl.2.damoh.golem.de/c6711059a68e8e1825e74a11e998cfbc5875d82d/
110 B
672 B
XHR
General
Full URL
https://ssl.2.damoh.golem.de/c6711059a68e8e1825e74a11e998cfbc5875d82d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9vdGFlbG9veWVlYmFaZWU9T290YWVsb295ZWViYVplZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5VYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEuQmgobSksYS5GZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5ZcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay4kYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS5CZChjKTthLkl2KGwpO2EuSHYobSk7YS55digpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpsPXRoaXMuYVs4XTt0aGlzLmJ4PQp0aGlzLmFbNl07dGhpcy5IcD10aGlzLmFbOV07dGhpcy52bz10aGlzLmFbNl07dGhpcy50bD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLkF1PWI7Yi5wcm90b3R5cGU9e0lsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KbDp0aGlzLmF4KGEpfSxheDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYng6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhwOnRoaXMudW8oYSl9LHVvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52bzp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBrYT1jLkF1fHxrYSxkZD1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1kZC5JbCg0KTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWXA9ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuRGM9W107dGhpcy4kZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmJ2LmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5LZz17fX1jLkFrPWI7Yi5wcm90b3R5cGU9e2d3OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rIl8iKTtyZXR1cm4gYX0sZ2I6ZnVuY3Rpb24oYSl7dGhpcy5mYlthXXx8KHRoaXMuZmJbYV09MCk7dGhpcy5mYlthXSs9MTs1PHRoaXMuZmJbYV0mJiF0aGlzLktnW2FdJiYodGhpcy5LZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmd3KCksITApKX0sJGY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sCnNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFRvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxidjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5hdihhLmRhdGEpfSxhdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuY2EuZXZlbnRsaXN0ZW5lci5sZW5ndGgsCmQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sWWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sZGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuJGcoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHwKYls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuUnIoYSkpcmV0dXJuOyhiPXRoaXMuZGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxScjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxvZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxPYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHlnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxIaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKVGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx4ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OwowPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0seWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktCmEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoYSl9LmJpbmQodGhpcyksMTAwKX0sd2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxJPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrOwpjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUk7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMTg1OTc3NTM5MyYKNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0k9SStsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihJKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LHBiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJgoxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxtdDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGllOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLAplPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iub2I/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChuKXt9YS5pc1BoYW50b21KUz0KYjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LGFzOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5pZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFFhOmZ1bmN0aW9uKCl7dmFyIGE9e1ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LGtqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LApSczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxtbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxYbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5WaSgpfHxhLmtqKCl8fGEuUnMoKXx8YS5tbSgpfHxhLlhuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGhkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHViOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHFzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxLcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxkdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx0ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVGgoYikrIjoiK3RoaXMuVGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFRoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSwkZTpmdW5jdGlvbihhKXt0aGlzLlBhPWF9LHFnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUGE7dGhpcy5PZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LHFjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5xZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZWQpe3ZhciByPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYocj1rLlRhKGEsYikpO2YmJihyPWsuVGEocixmKSk7YyYmKHI9ay5UYShyLGMpKTtoJiYocj1rLlRhKHIsaCkpO2VkJiYocj1rLlRhKHIsaCkpO2UucWMocil9LGR2OmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSYmMTAyMyE9YS5jb2RlJiYxMDE4IT1hLmNvZGUpe3RyeXtpZihsYSYmKGIuc2Vzc2lvbl9pZD1sYSksYi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iLGEuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKSxiLmV2ZW50PWEuY29kZSxiLnNpdGVfaHJlZj0KdGhpcy5xcygpLGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH19Y2F0Y2goZCl7fXJldHVybiBifX0sT2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kdihhKTtpZihiKWlmKCFsfHwhbC5iYSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2YoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwueGQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wud2EoYSwhMCk7YT1sLndhKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIjthLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGIpO2wuSGEoYSxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5FY3x8KHRoaXMuRWM9e30pO3RoaXMuRWNbZl18fCh0aGlzLkVjW2ZdPTApO3RoaXMuRWNbZl0rKzsxMDx0aGlzLkVjW2ZdfHwoZj1sLnhkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLndhKGYsITApLGY9bC53YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIisKZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxHZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwua3EoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxvZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoPwp0aGlzLmJiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxxZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5qZChhKToiIn0samQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LGFxOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuQWUoYSl8fHRoaXMucHQoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5ZZSYmd2luZG93LnNhbmRib3guWWVbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7CmlmKHRoaXMub2coYSkpcmV0dXJuIHRoaXMub2coYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnBiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtmLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuVWEoYSxiLkdhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLm5kKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLlJvKGMsYSk7cmV0dXJuIGN9LFVhOmZ1bmN0aW9uKGEsYiwKZCxmLGMsaCxlLHIpe3ZhciBrPWh8fGw7aD0hMDtyJiYoaD0hMSk7aWYoayYmay5iYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2sud2EoYSxoKTtoPWsud2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT1kW3FdO3JldHVybiBrLkhhKGgsZixjLCIiLCIiLGUpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYShhLGIsZCxmLGMsayxlLHIpfS5iaW5kKHRoaXMpLDUwMCl9LCRnOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUpe3ZhciByPSEwO2UmJihyPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2U9ZDtkPSIiO2Zvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHIpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxXdDpmdW5jdGlvbihhLGIsZCl7dGhpcy4kZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5EYylmb3IodmFyIGMgaW4gdGhpcy5EYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxhaDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlVhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuV3QoZi5uZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRjPWF9LFd4OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5VYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxNcDpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sa3Q6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuQWt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93Lm1nPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fAp7fX1jLnprPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuVHU9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuaXU9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSng9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Bcj17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ4PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTWY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5OZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuSW89e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSGY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5peD17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaHU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OeD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnlxPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5hZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLiRjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5MZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuTG89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5PYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVmQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuWGQ9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLktvPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi4kaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLmx1PXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IucmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5iZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuSXg9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZng9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5qdT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMuemt8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnJvPXRoaXMuYVsyXTt0aGlzLlVxPXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxXTt0aGlzLkFwPXRoaXMuYVs3XTt0aGlzLiRtPXRoaXMuYVs1XTt0aGlzLnN1PXRoaXMuYVs2XTt0aGlzLktqPXRoaXMuYVsyXTt0aGlzLiR1PXRoaXMuYVsxMF07dGhpcy5icD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs3XX1jLnNxPWI7Yi5wcm90b3R5cGU9e3FvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ybzp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVXE6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MdDp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXA6dGhpcy5abShhKX0sWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLiRtOnRoaXMucnUoYSl9LHJ1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zdTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktqOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kdTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYT1jLnNxfHxtYSxmZD1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1mZC5xbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkJrPWI7Yi5wcm90b3R5cGU9e3JlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxxYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4Iil9LGtzOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGZkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5mZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5mZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LHdjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmUodGhpcy5xYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmZkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxndDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndjKCkrIjIifSxRZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlKHRoaXMua3MoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5mZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMuQmt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZXE9dGhpcy5hWzRdO3RoaXMucG49dGhpcy5hWzddO3RoaXMuVWo9dGhpcy5hWzZdO3RoaXMua2k9dGhpcy5hWzddO3RoaXMuRnA9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5ndj1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZXE6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBuOnRoaXMuVGooYSl9LFRqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Vajp0aGlzLmppKGEpfSxqaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua2k6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5ndnx8bmEsZ2Q9Cm5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWdkLmNxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/CmYuZjpmdW5jdGlvbigpe2QuZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51Zj1ifSkoYyk7dmFyIEo9Yy51Znx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVszXX1jLk9xPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5aajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIG9hPWMuT3F8fG9hLGhkPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWhkLllqKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Mudm09CkouZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5HPW51bGw7dGhpcy5BYz0xMDA7dGhpcy54Yj0wO3RoaXMuSWE9MTUwO3RoaXMuQWI9MDt0aGlzLkp2KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy54Yjw9dGhpcy5JYT8odGhpcy54YisrLHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpOjA+dGhpcy5JYSYmKHRoaXMuQWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy5BYykpfSxBdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhiPnRoaXMuSWE/ITA6ITF9LHpkOmZ1bmN0aW9uKCl7dGhpcy54Yj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sSnY6ZnVuY3Rpb24oYil7dGhpcy5HPWJ9LGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR30sSzpmdW5jdGlvbihiKXt0aGlzLkphW2IucWIoKV09YjtLJiZLLllnJiZLLmZ3KGIpfSxBeTpmdW5jdGlvbigpe3JldHVybiBlLk9hKHRoaXMuSmEpfSwKSjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9LGx0OmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sTnk6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHQ9Yy52bXx8dDsoZnVuY3Rpb24oYyl7Yy54bT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkFjPTEwO3RoaXMueGI9MDt0aGlzLklhPTUwO3RoaXMuTj1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnNiPSIiO3RoaXMuaGc9ITE7dGhpcy5NKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApnPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt9LFN2OmZ1bmN0aW9uKGIpe3RoaXMuTj1ifSxCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk59LE12OmZ1bmN0aW9uKGIpe3RoaXMuS2U9Yn0senk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sSmU6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLnhiPD10aGlzLklhJiYodGhpcy54YisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuQWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LHhnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEFkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sUHk6ZnVuY3Rpb24oKXt9LFY6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuSHMoKXx8dGhpcy5PbygpO3RoaXMuQWQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKQ3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sT286ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZ2EoMTApKX0sSHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFM6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxIeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxmYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxEZTpmdW5jdGlvbigpe3JldHVybiExfSxDaDpmdW5jdGlvbihiKXt0aGlzLnNiPWJ9LHl5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2J9LHhoOmZ1bmN0aW9uKCl7dGhpcy5zYj1udWxsfSxFeTpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuc2ImJihiPSEwKTtyZXR1cm4gYn0sSnk6ZnVuY3Rpb24oKXt0aGlzLmhnfHwodGhpcy5oZz0hMCl9LHNjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHZ5OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIG49Yy54bXx8bjsoZnVuY3Rpb24oYyl7Yy5zaT1KLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLkRmPSIxIjt0aGlzLkVmPSIyIjt0aGlzLnlvPSIzIjt0aGlzLkljPTA7dGhpcy5laD0zMDt0aGlzLkZiPVtdO3RoaXMuWmE9W107dGhpcy5iYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5QZj10aGlzLldoPSExO3RoaXMuc3RhdHVzPXRoaXMuSWM7dGhpcy5pZD1lLmdhKDEwKTt0aGlzLkJkKGIpO3RoaXMuS3YoYSl9LGM6ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7dGhpcy5XaHx8KHRoaXMuV2g9ITAsZS5HZSgpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtTJiZTLk1iJiYhcGEmJihwYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sRjpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLlB2KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5QaCgpLHRoaXMuUGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLkZiLnB1c2goYiksdGhpcy5aYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLkZiJiYwPHRoaXMuRmIubGVuZ3RoJiYodGhpcy5GYj1lLnVuaXF1ZSh0aGlzLkZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5GYi5qb2luKCIsIikpKTtpZih0aGlzLlphKXtmb3IodmFyIGc9MDtnPHRoaXMuWmEubGVuZ3RoO2crKyl0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXT09dGhpcy5iY1tiXSYmYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSx0aGlzLmJjW3RoaXMuWmFbZ10ucmVhc29uXTwKdGhpcy5iY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbZ10uZGV0YWlsKSxiPXRoaXMuWmFbZ10ucmVhc29uKTt0aGlzLmJjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LFB2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZn0sUXY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnlvfSxLYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSWN9LEdmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxteTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5FZn0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuSWN9LEJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPQpifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEt2OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxoczpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LFp0OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5zaXx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbD10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbNV07dGhpcy5Uaz10aGlzLmFbMl07dGhpcy5Ebz10aGlzLmFbNF07dGhpcy5QdD10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs2XX1jLlhpPWI7Yi5wcm90b3R5cGU9e1VsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5WbDp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQmo6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRrOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuRG86dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlB0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5YaXx8cWEsaWQ9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuVWwoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSwKaWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTiYmdGhpcy5OKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5Eanx8VDsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuT2Q9bnVsbDt0aGlzLnJ4PTFFMzt0aGlzLm5oPW51bGw7dGhpcy5Kdz0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub2IpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Kci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuRHMuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5DcyhhLApiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLnV4KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy52eChiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkJzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy53cShhKX0uYmluZCh0aGlzKSl9LHdxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sdXg6ZnVuY3Rpb24oYil7dGhpcy5PZHx8KHRoaXMuT2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnd4KGIpfS5iaW5kKHRoaXMpLHRoaXMucngpKX0sd3g6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2QpO3RoaXMuRigpfSx2eDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5PZCl9LApCczpmdW5jdGlvbihiKXt0aGlzLnN5KGIpO3RoaXMubmg9bmV3IERhdGU7dGhpcy5uaC10aGlzLld1PHRoaXMuSnc/dGhpcy5GKCk6dGhpcy5zKCl9LERzOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuQmQobmV3IFQoYSkpKTt0aGlzLkYoKX0sSnI6ZnVuY3Rpb24oKXt9LENzOmZ1bmN0aW9uKCl7dGhpcy5XdT1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5Faj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk9hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZywKdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRWp8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5rdj10aGlzLmFbNV07dGhpcy5Qcz10aGlzLmFbM107dGhpcy51dT10aGlzLmFbNl07dGhpcy4keD10aGlzLmFbN107dGhpcy5Paz10aGlzLmFbMTBdO3RoaXMucm49dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMl19Yy5Haj1iO2IucHJvdG90eXBlPXtqdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua3Y6dGhpcy5PcyhhKX0sT3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51dTp0aGlzLlp4KGEpfSxaeDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHg6dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9rOgp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1YT1jLkdqfHx1YSxqZD1uZXcgdWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1qZC5qdig0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3RoaXMubmcoKTt0aGlzLnBnKCk7dGhpcy54cT0hMX0sbmc6ZnVuY3Rpb24oKXt0aGlzLk5iPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy5OYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5TKGIpfSxwZzpmdW5jdGlvbigpe2lmKCF0aGlzLk5iKXt2YXIgYj0KdGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuTmI9ITApO3RoaXMuVihhKX19LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTiYmKDAsdGhpcy5OKSgpfS5iaW5kKHRoaXMpKX0sSmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5FZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRWQoYSl9LmJpbmQodGhpcykpfSxFZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLktlJiYoMCx0aGlzLktlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTsKcmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgdmE9Yy5Za3x8dmE7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTTpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkljO3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMX0sYzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuS2M9ITE7dGhpcy5XZD0xO3RoaXMuTWM9W107dGhpcy5sYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/CmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuV2Q9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLmxiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5sYj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5sYj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMubGI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTsKdGhpcy5LYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuZWgmJiF0aGlzLmhhKCkmJih0aGlzLmxiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMuaGEoKSYmKHRoaXMuS2EoKSx0aGlzLmdldFBsYXllcigpLnhxPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5zYjthJiYoYS50ZCgpLGEuZ2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuS2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5laCYmIXRoaXMuaGEoKSYmKHRoaXMubGI/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLk1jLmluZGV4T2YoYSkmJnRoaXMuTWMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5zKCksdGhpcy5lYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm8oImFkZXJyb3IiLGIuY29kZSksdGhpcy5NYy5sZW5ndGg+PXRoaXMuV2QmJnRoaXMudSgpKX0sWnQ6ZnVuY3Rpb24oYil7dGhpcy5pKCJKVzogIitiLnR5cGUpfSx1OmZ1bmN0aW9uKGIpe2I/dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xOnRoaXMua2U/dGhpcy5rZSsrOnRoaXMua2U9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSGgoYS52aWRlb1RhZyk/YS5OYj90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLktjfHx0aGlzLmlzUGxheWluZz8odGhpcy5rZT50aGlzLmxlJiYoYj0hMSksdGhpcy5GKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSw1MCk6KGEubmcoKSxhLnBnKCksYS5OYnx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgd2E9Yy5Ya3x8d2E7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5kcygpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IHZhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5KKGcpfHx0aGlzLmx0KGcpfHwodGhpcy5LKGcpLGc9bmV3IHdhKGcsdGhpcy5HKSxnLk0oKSxnLmMoKSl9fXRoaXMuSSgpfX0seHk6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sZHM6ZnVuY3Rpb24oKXt2YXIgYj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnBiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB4YT1jLlprfHx4YSx5YT1uZXcgeGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBqPXRoaXMuYVs2XTt0aGlzLkN3PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuSWs9YjtiLnByb3RvdHlwZT17b2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBqOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ddzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMuSWt8fHphLGtkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWtkLm9qKDQpOyhmdW5jdGlvbihjKXtjLlpuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTsKdmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLlpufHxBYTsoZnVuY3Rpb24oYyl7Yy5Zbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHwKYi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIpLHRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5Zbnx8QmE7KGZ1bmN0aW9uKGMpe2MuJG49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5PYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPQpiW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9bmV3IEFhKGcpLHRoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuJG58fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ibj10aGlzLmFbNF07dGhpcy5LdT10aGlzLmFbMV07dGhpcy5Udz10aGlzLmFbOV07dGhpcy54dT10aGlzLmFbNV07dGhpcy5KdD10aGlzLmFbMV07dGhpcy5IdD10aGlzLmFbMl07dGhpcy5CbD10aGlzLmFbOF07dGhpcy5rcD10aGlzLmFbNF07dGhpcy5iaj10aGlzLmFbNF07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVszXX1jLlFzPWI7Yi5wcm90b3R5cGU9e0duOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ibjp0aGlzLkp1KGEpfSwKSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkt1OnRoaXMuU3coYSl9LFN3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Udzp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh1OnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KdDp0aGlzLkd0KGEpfSxHdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHQ6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkJsOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5haihhKX0sYWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJqOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuUXN8fEVhLGxkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5Hbig0KTsoZnVuY3Rpb24oYyl7Yy5Nbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5pYihiKX0uYmluZCh0aGlzKSl9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPQpiLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuTW58fEZhOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucWE9dGhpcy52Yz10aGlzLnhhPXRoaXMuU2M9ITE7dGhpcy51aD1lLndiKDEwKTt0aGlzLlZoPSEwO3RoaXMuZ2M9dGhpcy5OZz0hMTt0aGlzLmloKCk7dGhpcy5ocSgpO3RoaXMuU2EoKX0sS3k6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLnFiKCksCiI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRGE/Yi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5EYT90eXBlb2YgYi5pbWEuRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuRGE/Yi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi5EYT90eXBlb2YgYi5SLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlRkOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuVGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuVWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS52YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi52YToidW5kZWZpbmVkWCIsIjsiLGIuUj8KdHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuWmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSmI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5yYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudmF9LEJnOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmMpe3ZhciBiPXRoaXMucmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy52Yz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMudmM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy52Y30sanQ6ZnVuY3Rpb24oKXtpZighdGhpcy5NZyl7dmFyIGI9CnRoaXMucmIoKSxhPXRoaXMuaXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk1nPSEwKX1yZXR1cm4gdGhpcy5NZ30saXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5TYz0hMCk7cmV0dXJuIHRoaXMuU2N9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5KYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxYZTpmdW5jdGlvbigpe3RoaXMuZ2M9ITA7dmFyIGI9dGhpcy5CZygpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsKYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlFhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5oYz0hMDtpZihlLnViKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuaGM9ITA7ZS51YigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSx3eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuY2cmJmIuYWRzJiYodGhpcy5jZz1iLmFkcyk7cmV0dXJuIHRoaXMuY2d9LGhxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLkthKCk7dGhpcy5hYSghMCk7dGhpcy5vKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7CnRoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQmcoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksNTApfSxpaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5qdCgpKXt2YXIgYT0KdGhpcy5yYigpLGc9dGhpcy5KYigpO2EmJmcmJih0aGlzLnJiKCksdGhpcy5KYigpLHRoaXMuZ2N8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nYz90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMucmIoKX1lbHNlIHRoaXMuTmc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJiKCksYj10aGlzLkpiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5hYSgpKToodGhpcy5hYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuTmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5paCgpfS5iaW5kKHRoaXMpLDUwKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0saXE6ZnVuY3Rpb24oKXt0aGlzLm1jfHwodGhpcy5tYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMubWMhPWIuYWRzLnN0YXRlJiYodGhpcy5tYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5tYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLm1jPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pcSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXswPD1lLmhkKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlc/dGhpcy51KCEwKToodGhpcy5xYT0hMCx0aGlzLnMoImVtcHR5IHZhc3QiKSl9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwodGhpcy5WaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkYodGhpcy5WaCxmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sbnE6ZnVuY3Rpb24oKXt0aGlzLkZ5fHwoMTA8dGhpcy5zeD8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN4KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuenYoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnEoKX0uYmluZCh0aGlzKSw1MCkpKX0senY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmCiF0aGlzLnR4KXt0aGlzLnR4PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiKwphLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIEdhPWMuTG58fEdhOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkloKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy5JaChiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSxJaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDwKZS5PYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm1hfHx0aGlzLkooYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuSyhhKSwobmV3IEdhKGEsdGhpcy5HKSkuYygpKSk7cmV0dXJuITB9cmV0dXJuITF9LEk6ZnVuY3Rpb24oKXt0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMuQWMpfX0pfSkoYyk7dmFyIEhhPWMuTm58fEhhLElhPW5ldyBIYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ucj10aGlzLmFbOV07dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VcD10aGlzLmFbNV07dGhpcy5vcD10aGlzLmFbN107dGhpcy5IbD10aGlzLmFbOV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy5tcD10aGlzLmFbM107dGhpcy5xcD10aGlzLmFbMV07dGhpcy5Gbz0KdGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNl19Yy5PeD1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubnI6dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KcDp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXA6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vcDp0aGlzLkdsKGEpfSxHbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGw6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldvOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubXA6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnFwOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7CnZhciBKYT1jLk94fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5tcig0KTsoZnVuY3Rpb24oYyl7Yy5sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7Yi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlMoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0sbGE6ZnVuY3Rpb24oKXt9LGliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLk4mJgoidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LHNjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLAphPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5sbnx8S2E7KGZ1bmN0aW9uKGMpe2Mua249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuS2I9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWmI9ITE7dGhpcy53aCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT1iLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlpiPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTsKYi5nZXRQbGF5ZXIoKTt0aGlzLlhjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuWWYoKTp0aGlzLnMoKX0sWGM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7YS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuWmI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7CmEuZ2V0UGxheWVyKCk7dGhpcy5aYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMucygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhjLmJpbmQodGhpcyksMTAwKX19LFlmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmCih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2IpLHRoaXMucygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LYiksdGhpcy5zKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5LYiYmKHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpifHwodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkYoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5ZZi5iaW5kKHRoaXMpLDUwKX19LHdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiYKYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlpiPSEwLHRoaXMucygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53aCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmtufHxMYTsoZnVuY3Rpb24oYyl7Yy5tbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmCnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5tbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR5PXRoaXMuYVs0XTt0aGlzLnBpPXRoaXMuYVs4XTt0aGlzLk1pPXRoaXMuYVs2XTt0aGlzLlNwPXRoaXMuYVsyXTt0aGlzLlNqPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzddfWMuc3I9YjtiLnByb3RvdHlwZT17Y3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5keTp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucGk6dGhpcy5MaShhKX0sTGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5NaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3A6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5zcnx8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuY3koNCk7KGZ1bmN0aW9uKGMpe2MuaG49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZWxfO2F8fCgiZnVuY3Rpb24iPT10eXBlb2YgYi5lbD9hPWIuZWwoKToiZnVuY3Rpb24iPT10eXBlb2YgYi5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCgpKSkpO3RoaXMuUyhhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCihiPWJbMF0pO3RoaXMuVihiKX0saWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YSYmYi5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZTIifSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLm11dGVkJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5tdXRlZCYmKGI9YS5tdXRlZCgpKTtyZXR1cm4gYn0sc2M6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5obnx8UGE7KGZ1bmN0aW9uKGMpe2MuZ249dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5YZigpO2Iub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5Kb3x8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygidGltZXVwZGF0ZSIpO3RoaXMuRighMCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX0ZJUlNUX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLm8oImFkc2Vycm9yIik7dGhpcy5BcyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LEFzOmZ1bmN0aW9uKGIpe3ZhciBhPTk5OTk5OTtpZihiLmRhdGEmJmIuZGF0YS5BZEVycm9yKWZvcih2YXIgZyBpbiBiLmRhdGEuQWRFcnJvciliLmRhdGEuQWRFcnJvci5oYXNPd25Qcm9wZXJ0eShnKSYmIm51bWJlciI9PXR5cGVvZiBiLmRhdGEuQWRFcnJvcltnXSYmKGE9Yi5kYXRhLkFkRXJyb3JbZ10sdGhpcy5vKGEpKTs5MDE9PWE/dGhpcy5zKCk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PQphPyh0aGlzLlpiPSEwLHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMuSm89ITAsdGhpcy5zKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5YZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz90aGlzLkYoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBRYT1jLmdufHxRYTsoZnVuY3Rpb24oYyl7Yy5qbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UmJiJmdW5jdGlvbiI9PQp0eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy56ZCgpLHRoaXMuSSgpfX0pfSkoYyk7dmFyIFJhPWMuam58fFJhLFNhPW5ldyBSYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kaz10aGlzLmFbMV07dGhpcy5FdD10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsxXX1jLkh3PWI7Yi5wcm90b3R5cGU9e2NrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuZGs6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkV0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgVGE9Yy5Id3x8VGEsb2Q9bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9b2QuY2soNCk7KGZ1bmN0aW9uKGMpe2MuWmk9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5oaD1hfSxNOmZ1bmN0aW9uKCl7fSxIZTpmdW5jdGlvbihiKXt0aGlzLmhoPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmhoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTt0aGlzLlYoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKUDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgVWE9Yy5aaXx8VWE7KGZ1bmN0aW9uKGMpe2MuWWk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxIZTpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5vKCJjb250ZW50cGxheSIpO3RoaXMuRigpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZhPWMuWWl8fFZhOyhmdW5jdGlvbihjKXtjLiRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IFVhKGQsYSksdGhpcy5KKGQpfHwoZC5IZShhKSx0aGlzLksoZCksCmQ9bmV3IFZhKGQsdGhpcy5HLGcpLGQuSGUoZyksZC5jKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgV2E9Yy4kaXx8V2EsWGE9bmV3IFdhKGlhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbMTBdO3RoaXMubm89dGhpcy5hWzhdO3RoaXMud3M9dGhpcy5hWzddO3RoaXMuSm49dGhpcy5hWzhdO3RoaXMub2s9dGhpcy5hWzldO3RoaXMueGk9dGhpcy5hWzldO3RoaXMuT3U9dGhpcy5hWzZdO3RoaXMuRmw9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMV19Yy50cT1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXA6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5vOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53czp0aGlzLkluKGEpfSwKSW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpuOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vazp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhpOnRoaXMuTnUoYSl9LE51OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PdTp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYT1jLnRxfHxZYSxwZD1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1wZC5QcCg0KTsoZnVuY3Rpb24oYyl7Yy55bD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07CnRoaXMuUyhiKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxRYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBaYT1jLnlsfHxaYTsoZnVuY3Rpb24oYyl7Yy54bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5RYSgpPwooJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5MYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuTGMoKX0uYmluZCh0aGlzKSkpOnRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5zKCk6KHRoaXMubygiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyICRhPWMueGx8fCRhOyhmdW5jdGlvbihjKXtjLnpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFphKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgJGEoYix0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFiPWMuemx8fGFiLGJiPW5ldyBhYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5pbT10aGlzLmFbOV07dGhpcy50bz10aGlzLmFbM107dGhpcy5Edj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy5ycT1iO2IucHJvdG90eXBlPXtobTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaW06dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRvOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Edjp0aGlzLmooYSl9LApqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLnJxfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5obSg0KTsoZnVuY3Rpb24oYyl7Yy5xbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLlBlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5mYSgpO3JldHVybn10aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlYoYik6dGhpcy5mYSgpfSxYdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnNiLGc9dGhpcy5xYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5NYiYmKDA8PWcuaW5kZXhPZihkKXx8YS50ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUGU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxSYTpmdW5jdGlvbigpe3RoaXMuUGUrKztpZigxMDx0aGlzLlBlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGxhOmZ1bmN0aW9uKCl7fSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLk4mJnRoaXMuTigpfX0pfSkoYyk7dmFyIGRiPWMucW18fGRiOyhmdW5jdGlvbihjKXtjLnBtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHhhOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8Cih0aGlzLnRiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMudGIrKywxNTx0aGlzLnRiKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMubmU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSk7dGhpcy55YSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLnhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkhyPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLkhyPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWHUoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMucG18fGViOyhmdW5jdGlvbihjKXtjLnJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5ybXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFxPXRoaXMuYVsxXTt0aGlzLmw9dGhpcy5hWzVdfWMubGo9YjtiLnByb3RvdHlwZT17cHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFxOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5sanx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQucHEoNCk7KGZ1bmN0aW9uKGMpe2Mud2s9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5WKGIuZWxlbWVudCl9LFJiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMud2t8fGliOyhmdW5jdGlvbihjKXtjLnZrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PQpiLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCl9fSl9KShjKTt2YXIgamI9Yy52a3x8amI7KGZ1bmN0aW9uKGMpe2MueGs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMueGt8fGtiLGxiPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbz10aGlzLmFbNF07dGhpcy5Gbj10aGlzLmFbNF07dGhpcy5Laz10aGlzLmFbM107dGhpcy56aT10aGlzLmFbMV07CnRoaXMuTnQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMTBdfWMuV2k9YjtiLnByb3RvdHlwZT17Wm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Gbjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5OdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIG1iPWMuV2l8fG1iLHNkPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXNkLlpvKDQpOyhmdW5jdGlvbihjKXtjLlZrPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTt0aGlzLnBoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuUyhnKTt0aGlzLlYoZyk7dGhpcy5kZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmRkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kZCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG1xOmZ1bmN0aW9uKCl7ZS5UZyh0aGlzLmRkKTtlLnhlKHRoaXMuZGQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tcSgpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxEZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIG5iPWMuVmt8fG5iOyhmdW5jdGlvbihjKXtjLlVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5GKCEwKX19KX0pKGMpO3ZhciBwYj1jLlVrfHxwYjsoZnVuY3Rpb24oYyl7Yy5Xaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS55ZyhiLCJlbGVtZW50SUQiKTsKZS5UZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IHBiKGIsdGhpcy5HKSkuYygpKSk7dGhpcy5BYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5BYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcWI9Yy5Xa3x8cWIscmI9bmV3IHFiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmR0PXRoaXMuYVs1XTt0aGlzLnJqPXRoaXMuYVs5XTt0aGlzLm1sPXRoaXMuYVs3XTt0aGlzLlhyPXRoaXMuYVsyXTt0aGlzLlRzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuRm09YjtiLnByb3RvdHlwZT17Y3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmR0OnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMucmo6dGhpcy5sbChhKX0sbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5tbDp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWHI6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubDphfX19KShjKTt2YXIgc2I9Yy5GbXx8c2IsdGQ9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuY3QoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkNrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEx2OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSwKYil7dGhpcy5kYXRhW2FdPWJ9LFBvOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuQ2t8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5YYT1hO3RoaXMuc2c9dGhpcy5maT0hMTt0aGlzLmpoPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeChhKSk7dmFyIGU9dGhpcy5EYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC5CZSh0aGlzLlhhLnVybCkmJmwuSmQpe3ZhciBoPW5ldyB4KGEudXJsKTsKaC5MdigiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLm5hKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5uYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuRGs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuc2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCwKdGhpcy5YYS51cmwsITEpOnRoaXMuRGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy5maXx8KHRoaXMuRGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLkRiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuRGIuc2VuZChhKX1jYXRjaChjKXtsJiZsLkJlKHRoaXMuWGEudXJsKT9sLkpkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwuQmUodGhpcy5YYS51cmwpLHRoaXMuamgmJnRoaXMuamgoKX1yZXR1cm4gdGhpcy5EYn19fSkoYyk7dmFyIHRiPWMuRGt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmpjPSIiO3RoaXMuJGQ9dGhpcy5pYz10aGlzLm5iPW51bGw7dGhpcy5McT10aGlzLnliPXRoaXMuWmc9ITE7dGhpcy5HYT0iIjt0aGlzLlZnPSExO3RoaXMuQ2E9CnRoaXMua2Q9IiI7dGhpcy5SZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLkhnPXRoaXMuVGI9IiI7dGhpcy5qZT0hMTt0aGlzLmhmPTA7dGhpcy55Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5FYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVmI9IiI7dGhpcy56Yj1bXTt0aGlzLldiPVtdO3RoaXMuVWI9IiI7dGhpcy5qZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnVlPSExO3RoaXMub3E9dGhpcy5LZD1udWxsO3RoaXMuRmg9dGhpcy5GYz10aGlzLmpnPXRoaXMubmY9dGhpcy5KZD10aGlzLmFlPXRoaXMuSmM9CiExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMubWQ9MDt0aGlzLkpnPSExO3RoaXMuSWc9MUUzfWMuRWs9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuc2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5qYyxhZHRhZ21vZGlmaWVyOnRoaXMubmIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmljLGFkdGFncmVnZXg6dGhpcy4kZCxqc3BvcHVwczp0aGlzLlpnLHNpZGVsb2Fkczp0aGlzLnliLGRpc2FibGV0ZXN0czp0aGlzLkxxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuVmcsZ2xvYmFsQ29uZmlnOnRoaXMua2QsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5SZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5UYixob21hZEFkcGF0aDp0aGlzLkhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuamUsCnRlc3RDb29raWVBdHRlbXB0czp0aGlzLmhmLEhPTUFEX1ZFUklGSUVEOnRoaXMueWYsSE9NQURfQkxPQ0tFRDp0aGlzLndmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkViLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkhjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy54Zix0ZXN0SGlkZTp0aGlzLlZiLHRlc3RUYWdzOnRoaXMuemIsdGVzdFRhZ3NKUzp0aGlzLldiLHRlc3RDb29raWU6dGhpcy5VYix0aHJvdHRsZTp0aGlzLmpmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMudWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5vcSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5hZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5KZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5TYixzZXJ2ZXJJZDp0aGlzLkFoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5wYywKdnBhaWQ6dGhpcy5GYyxza2lwQWxsb3dlZDp0aGlzLkZoLHZtYXBzOnRoaXMuYWl9fSxGczpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LGVzOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLndiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuTXAoYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0iIixlPSIiLGg9IiIsaz0iIjtpZighdGhpcy5zYSYmIWIpcmV0dXJuIG5ldyB4KGEpO2M9dGhpcy5BZShhKTtlPXRoaXMuemEoYSk7Yz8odGhpcy54YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy54ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmpjfHx0aGlzLm5ifHx0aGlzLmljfHx0aGlzLiRkKSYmKGs9dGhpcy5mdShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdzKGUuaG9zdCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5wYihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy54YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsCiIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxCZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkFlKGEpO3JldHVybiBifSxnczpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5yeTtyZXR1cm4ibm9uZSJ9LG5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy5BaF19LHhkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZCgpLGI9dGhpcy5FaCgobmV3IERhdGUpLmdldFRpbWUoKSsKIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sZmg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sZXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5maChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pOwpCPVtdO2ZvcihsIGluIGMpQi5wdXNoKGwrIj0iK2NbbF0pO2M9Qj1lbmNvZGVVUklDb21wb25lbnQoQi5qb2luKCImIikpfWVsc2UgYz10aGlzLmZoKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9bD1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWwucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sZnU6ZnVuY3Rpb24oYSl7dGhpcy5qYyYmKGErPXRoaXMuamMpO2lmKHRoaXMubmIpZm9yKHZhciBiIGluIHRoaXMubmIpdGhpcy5uYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5uYltiXSkpO3RoaXMuaWMmJihhPXRoaXMuZXUoYSx0aGlzLmljKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlZnPSEwO3RoaXMua2Q9YTt0aGlzLkNhPWI7dGhpcy5WZT1kO3RoaXMuS2Q9Yzt0aGlzLm5jPWU7dGhpcy5TYj1ofHx7fTt0aGlzLlZ0KCk7aWYoInN0cmluZyI9PQp0eXBlb2YgdGhpcy5DYSl0aGlzLlR0KCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLlljKCl9Y2F0Y2goayl7dGhpcy5uYSgibm9DbGllbnRDb25maWciKX19LGhiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxWdDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5rZCt0aGlzLlFjKCJnbG9iYWwiKSksdGhpcy56cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLlljKCl9LmJpbmQodGhpcyksITApfSxUdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5RYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLlFjKCJjbGllbnQiKSksdGhpcy5ZYy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuWmUoImNsaWVudCIpO3RoaXMubmEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFFjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLndiKCk7dGhpcy5TYiYmdGhpcy5TYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuU2ImJnRoaXMuU2Iubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5uYz0hMSk7dGhpcy5uYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm5jPwp0aGlzLm5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmJhPXRoaXMuUmc9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMud2YpKTt0aGlzLkJiKCk7ZS5xYyhrLlR1KTsoYj1lLmhkKHRoaXMubmQoKSkpfHwoYj1lLmhkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx6czpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5UYnx8dGhpcy5HYXx8dGhpcy5ZYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKSwKdGhpcy5CYigpKX19LFljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuQ2F9ZWxzZSBhPXRoaXMuQ2E7dGhpcy5pc0VuYWJsZWQ9dGhpcy5YYihhLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlRiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5IZz1hLmFkcGF0aHx8IiI7dGhpcy5qZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkFoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVGImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoPwp0aGlzLnFkKCExKToodGhpcy5zYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5CYigpKX0scWQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB4KHRoaXMueGQoKSksZD10aGlzLnphKHRoaXMuVGIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5UYit0aGlzLlFjKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5sdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5aZSgiY3VzdG9tZXIiKTthP3RoaXMuUG0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5QbT0hMCwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLnFkKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxsdzpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe310aGlzLkpkPXRoaXMuWGIoYi5zdHJpY3QpO3RoaXMubmY9dGhpcy5YYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5qZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucGM9dGhpcy5YYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuWGIoYi5lbmFibGVkKTt0aGlzLlZiPWIudGVzdGhpZGV8fCIiO3RoaXMuemI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLldiPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuamM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1iLmFkdGFnbW9kaWZpZXJ8fApudWxsO3RoaXMuaWM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLiRkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlpnPWIuanNwb3B1cHN8fCExO3RoaXMueWI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuRmM9Yi52cGFpZHx8ITE7dGhpcy5TYi52cGFpZD10aGlzLkZjO3RoaXMuRmg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5WYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYWk9Yi52bWFwc3x8IiI7dGhpcy5VYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnBzKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5qZSYmKHRoaXMuVWI9bnVsbCk7dGhpcy5qZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnVlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy51ZT0hMCx0aGlzLnFkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLkl3KCkmJgoodGhpcy5WYnx8dGhpcy5XYnx8dGhpcy56Ynx8dGhpcy5VYik/dGhpcy5WZT8odGhpcy5zYT10aGlzLmJhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSksdGhpcy5lZSgpLHRoaXMuQmIoKSk6dGhpcy5ydygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLnN3KCkpfX0scnc6ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy50dygpfSx0dzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLndpZHRoPTE7Yy5oZWlnaHQ9MTtjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Muc3JjPSJhYm91dDpibGFuayI7dmFyIGg9ZS5nYSgxMCksQj1lLmdhKDEwKSxrPWUuZ2EoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGssZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrCmEoQikrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UucGIoYShoKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChsKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpO2lmKDMhPWQpe3ZhciBhPWUuaWUoKTshYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5RYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxzdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMuRWIpKTt0aGlzLkJiKCl9LElkOmZ1bmN0aW9uKGEpe3RoaXMuSmM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9CnRoaXMuc2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKGEpKSx0aGlzLkJiKCksdGhpcy5lZSgpKX0scXc6ZnVuY3Rpb24oKXtpZih0aGlzLlZiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlZiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuVmIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuTmgoKX1lbHNlIHRoaXMuTmgoKX0sCk1oOmZ1bmN0aW9uKCl7dmFyIGM7dmFyIGQ7ZnVuY3Rpb24gYSgpe2M9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpO3RoaXMud3coYywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmVmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5JZCh0aGlzLkhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitjKyInIHdhcyBibG9ja2VkIil9dGhpcy56Yj1udWxsLHRoaXMuZWYoKX0sd3c6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLndiKCkpOwp0aGlzLnh3KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5NaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWQodGhpcy5IYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5XYiYmdGhpcy5XYi5sZW5ndGgpe3ZhciBjPXRoaXMuV2Iuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSx4dzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpOwpsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LGVmOmZ1bmN0aW9uKCl7dGhpcy5VYj8odGhpcy5oZisrLHRoaXMuSGEobmV3IHgodGhpcy5VYiksdGhpcy5wdy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5mZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LGZmOmZ1bmN0aW9uKGEpe3RoaXMuSWQodGhpcy54ZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LHB3OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmhmP3RoaXMuZWYoKTp0aGlzLmZmKCJCQkIiKToKImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuS2goKTp0aGlzLmZmKCJBQUEiKX0sS2g6ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5oYih0aGlzLkViKSk7dGhpcy5CYigpO3RoaXMuZWUoKX0sQmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2UuUWEoKSYmKGE9IjEiKX1jYXRjaChjKXthPTJ9dGhpcy5KYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmhiKHRoaXMueWYpKTt0aGlzLktkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuS2QmJnRoaXMuS2QoKX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLm5mJiZ0aGlzLkZzKCkpe3ZhciBhPXRoaXMuZXMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LFBoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPQphLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEhhOmZ1bmN0aW9uKGEsYixjLGYsaCxCKXt0aGlzLm1kfHwodGhpcy5tZD0wKTt0aGlzLm1kKys7dGhpcy5tZD50aGlzLklnJiYhdGhpcy5KZyYmKHRoaXMuSmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLklnLCEwKSk7YT1uZXcgdGIoYSxiLGMpO2YmJihhLmZpPSEwKTtoJiZlLm10KCkmJihhLnNnPSEwKTtCJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxWZjpmdW5jdGlvbigpe2UuUWEoKXx8ZS5VYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubmEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMueGMoKXx8KGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTsKaC5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm5hKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxvdzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5haX0sa3E6ZnVuY3Rpb24oKXt0aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5oeC5iaW5kKHRoaXMpLAp0aGlzLmd4LmJpbmQodGhpcykpfSxoeDpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuQ3IoKX0sZ3g6ZnVuY3Rpb24oKXt9LENyOmZ1bmN0aW9uKCl7ZS5xYyhrLkJyKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLm5hKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxlZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnliLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMueWIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy55YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBSO3dpbmRvd1tjLndjKCldPXRoaXM7ZS5VYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxJdzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLmpmfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sd2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFhiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxFaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLHAsbix2LHUsdztwPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHgucHVzaChlKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PAoyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKHA+Pj4yOSk7eC5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO3A9bDtuPW07dj1xO3U9dDtmb3IoZj0wOzE5Pj1mO2YrKyl3PWMoZSw1KSsocCZufH5wJnYpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStuJjQyOTQ5NjcyOTU7cT1xK3YmNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciB1Yj1jLkVrfHx1YixsPW5ldyB1Yjt3aW5kb3cudWc9bDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5adz10aGlzLmFbNF07dGhpcy5XbT10aGlzLmFbMl07dGhpcy5LaT10aGlzLmFbMV07dGhpcy5jdz10aGlzLmFbMl07dGhpcy5rbD10aGlzLmFbNF07dGhpcy5zdD10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbN107CnRoaXMuVnI9dGhpcy5hWzddO3RoaXMuWW09dGhpcy5hWzNdO3RoaXMuWnE9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMl19Yy53bz1iO2IucHJvdG90eXBlPXtZdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWnc6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5LaTp0aGlzLmJ3KGEpfSxidzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY3c6dGhpcy5qbChhKX0samw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtsOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5zdDp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNwOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Wcjp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlltOnRoaXMuWXEoYSl9LApZcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWnE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB2Yj1jLndvfHx2Yix1ZD1uZXcgdmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT11ZC5Zdyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmI9YTthLm0uUD90aGlzLlZhPWEubS5QKCk6dGhpcy5WYT0iIjthLm0uUGcmJmEubS5QZyh7cGF1c2U6dGhpcy50ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLkxlLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuJHcuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5hYjt0aGlzLnBsYXllcj10aGlzLmIubTt0aGlzLkhiPXRoaXMuVGM9ITE7dGhpcy5LcD0xRTM7dGhpcy5qYT0KbnVsbDt0aGlzLlQ9Yjt0aGlzLnVhPXt9O3RoaXMudmlkZW89e307dGhpcy5HZD17fTtlLmdiKCJuZXdCaWdBZElkIik7dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmJmPTA7dGhpcy5SYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlJjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlJjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlVvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuRmQ9ITE7dGhpcy5iaD1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuUGM9ITE7dGhpcy5TaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLk1iPSExO3RoaXMuenE9CmUuZ2EoMTApO3RoaXMuUGI9ZS5nYSgxMCk7dGhpcy5PYj1lLmdhKDEwKTt0aGlzLkdoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm9jPXRoaXMudmI9ITE7dGhpcy5tZT1udWxsO3RoaXMuTmQ9dGhpcy5DYj10aGlzLndlPXRoaXMuU2U9dGhpcy5mZT10aGlzLmJkPXRoaXMuZGY9dGhpcy5hYz10aGlzLlBkPXRoaXMubGg9dGhpcy5lZD10aGlzLkt3PXRoaXMua2I9ITE7dGhpcy5lYz1bXTt0aGlzLlliPXt9O3RoaXMua2Y9ITF9Yy55az1iO2IucHJvdG90eXBlPXtCaDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pO3JldHVybiBifSxRaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5QYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULkpjP2UudHJhY2soImFkY2FsbCIsIjEiKToKZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay5Mbyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxGZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5rYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmJmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5ULmxxKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLlFoKCksbmV3IFUodGhpcyxhLHRoaXMuYmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5GYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5RaCgpLG5ldyBVKHRoaXMsYSx0aGlzLmJoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULkZjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLAprZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLk1hKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkZlKGEsYixjKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7dGhpcy5OZD10aGlzLkNiPXRoaXMuZWQ9ITE7dGhpcy5nPWE7dGhpcy5Udih0aGlzLmcpO3RoaXMuRWcoYSk7dGhpcy5lYz10aGlzLnZnKGEpO3RoaXMuWWI9e307dGhpcy5rZj0hMX0sRWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuR2Q9dGhpcy5zcyhhKSksdGhpcy5FZyhhLnBhcmVudCkpfSx2ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMudmcoYS5wYXJlbnQpKSwKYy5wdXNoKHRoaXMuJHIoYSkpKTtyZXR1cm4gY30sJHI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHNzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlguZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuY2QmJmEuY2QuZXJyb3ImJmEuY2QuZXJyb3IuY29kZSYmKGI9YS5jZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3LkdjLmNvZGU6Yj09RC5SZC5jb2RlP2UudyhrLkp4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpOihlLkdlKCksYj09RC5CZi5jb2RlJiZlLncoay5odSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Bcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcuemYuY29kZTplLncoay5peCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQ2YuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5OeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS53KGsuUngsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7CmJyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudyhrLml1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMub2N8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkliKGEpO3RoaXMuTWEoKX0sSWI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkxhLmxlbmd0aDspdHJ5e3ZhciBjPWEuTGEucG9wKCk7dGhpcy5FZShjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sVHY6ZnVuY3Rpb24oYSl7dGhpcy5mZT0KdGhpcy53ZT10aGlzLlNlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkx5PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7dGhpcy5VbyYmdGhpcy5wbGF5ZXIuc2MoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnNjKCkvCjEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuUW8oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLk9oKGIpPyh0aGlzLlNvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy51cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLlJ2KCkpOnRoaXMuemUoKT90aGlzLkRoKCk6dGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0sUnY6ZnVuY3Rpb24oKXt0aGlzLmFjPXRoaXMuUGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuYWM9ITApO2UuJGYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4udGYmJmUuVG8odGhpcy5nLm9yaWdpbi50Zik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCxhKTt0aGlzLmIubWgoKTt0aGlzLmIuQ2MoKTtmb3IoYT10aGlzLmIuTDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYi5DYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLnBmKCJ2cGFpZCIpO3RoaXMuYWMmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTsKdGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnVzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLkwuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTsKZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksCjE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmFxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5ZZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkxiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmVjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMueHgoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYKKHRoaXMueXgoKSx0aGlzLmIuTGIoITApLCF0aGlzLkNiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLk5kPSEwO2UudyhrLiRoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnllKHRoaXMuQ2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5MYighMCksdGhpcy5DeCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuTGIoITApLAp0aGlzLkd4KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLkV4KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkZ4KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSHgoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuRHgoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuYmkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcubGMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuYWcsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7CmEuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkJ4KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnp4KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLkF4KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuT2IpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5hYz0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLncoay5yZCwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYWM9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5tZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5YZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuWWQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSk7ZS5ZZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcykpO3RoaXMuYi5ObyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHp4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy50cmFjaygicGF1c2UiKTsKZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLlBkPSEwfSxBeDpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLlBkPSExfSxDeDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEJ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHl4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuWWEoImltcHJlc3Npb24iKTtlLncoay5IZiwKdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sR3g6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuT2MsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sRXg6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LEZ4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLkpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LEh4OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5OZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxEeDpmdW5jdGlvbigpe3RoaXMuTGQoKTtlLllhKCJjb21wbGV0ZSIpfSwKYmk6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5NYShhKX19LHh4OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudyhrLkl4LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7CnRoaXMuYmkoITApfSxRbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnhjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy5veC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sU286ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKdGhpcy5NZC5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuWmguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5MZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk1kLmJpbmQodGhpcykpfSxaaDpmdW5jdGlvbihhKXt0aGlzLkhifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGJ8fHRoaXMucWYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxxZjpmdW5jdGlvbihhKXtpZighdGhpcy5UYyYmdGhpcy5PaCh0aGlzLnZpZGVvKSYmIXRoaXMudmImJiF0aGlzLkhiKXt0aGlzLlRjPQohMDt0cnl7aWYoIWUuUWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudmJ8fCh0aGlzLnZiPSEwLHRoaXMueWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmpnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5NYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLm54KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQ2MoKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMuUmYoKTt0aGlzLmIubWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuY2YoKX19LGNmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmQpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJgooYT1hKGUuUGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMubGQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmxkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuTmMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTmMoKX1lbHNlIHRoaXMuTmMoKX0sTmM6ZnVuY3Rpb24oYSl7aWYodGhpcy5sZClmb3IodmFyIGI9MDtiPHRoaXMubGQubGVuZ3RoO2IrKyl0aGlzLmxkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmJkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5NYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkxlKCEwKSx0aGlzLk5jKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLndlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5TZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlFiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuUWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUWIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLlBjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5jZigpKX0uYmluZCh0aGlzKTt0aGlzLnBlKCkuQ2godGhpcyl9LExkOmZ1bmN0aW9uKCl7dGhpcy5ULnBjJiYhdGhpcy52YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLklvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5NYSgpfSxNYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSlpZih0aGlzLmZlPSEwLHRoaXMuTmR8fChlLncoay5sdSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5qYnx8dGhpcy5nLmNjKXtlLmdiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmJmKys7dGhpcy5IYj10aGlzLlRjPSExO3RyeXt0aGlzLnlkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5GZD0hMTt0cnl7dGhpcy5iLlVoKCl9Y2F0Y2goaCl7fXRoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5NYj0hMTt0aGlzLnBlKCkueGgoKTsKdGhpcy5nLmpiJiZ0aGlzLmcub3JpZ2luLk1lKCk7dGhpcy5nLmNjJiYoYT90aGlzLmcub3JpZ2luLmdoKCk6dGhpcy5nZSgpKX1lbHNlIHRoaXMuZ2UoKX0sb3g6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy55ZCh0aGlzLnZpZGVvKSx0aGlzLnplKCk/dGhpcy5EaCgpOnRoaXMuTWQoYSkpfSxNZDpmdW5jdGlvbihhKXt0aGlzLkhiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnplKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9jfHx0aGlzLlQuVmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZigpKTsKdGhpcy5nLm9yaWdpbi5rZyh3LlFkKX0scmY6ZnVuY3Rpb24oKXtpZih0aGlzLkt3KXRoaXMuTWEoKTtlbHNle3RoaXMuTWI9ITA7dGhpcy5iLm0uUmEmJiF0aGlzLmRmJiZ0aGlzLmIubS5SYSgpJiZlLncoay4kYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5QdyhhKTtpZighdGhpcy5DYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkNiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5OZD0hMDtlLncoay4kaCx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UueWUodGhpcy5DYil9Yz0iIjt0aGlzLmcuYWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2gpKSYmKGM9dGhpcy5nLmFmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkZkfHwodGhpcy5GZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5MZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5qYj8odGhpcy5IYj10aGlzLlRjPSExLHRoaXMueWQodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRmQ9ITEsdGhpcy5iLlVoKCksdGhpcy5nLm9yaWdpbi5NZSgpKTp0aGlzLk1hKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlJjLnJlcGxhY2UoIlt0aW1lXSIsZS50Zyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLlBjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxEaDpmdW5jdGlvbigpe3RoaXMub2M9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubnMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkNjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlloLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlhoKCk7dGhpcy5wZigpO3RoaXMubWU9c2V0SW50ZXJ2YWwodGhpcy5qcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG5zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgueGMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LGpxOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5tZSksdGhpcy5MZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnJmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLm1lKSx0aGlzLk1kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFJoOmZ1bmN0aW9uKCl7dGhpcy5saHx8KHRoaXMubGg9ITAsdGhpcy5lZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LFB3OmZ1bmN0aW9uKGEpe2UudyhrLlhkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5TaHx8dGhpcy52Ynx8KDA9PWEmJih0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKSx0aGlzLlNlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLndlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlJoKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5SaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5IZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5vYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULnBjJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5lZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkZmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5wYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk5mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuU2g9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudmIpe3RyeXtpZih0aGlzLlliW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuWWIuaW1wcmVzc2lvbiYmdGhpcy5ZYi5jb21wbGV0ZSYmIXRoaXMua2Ype3RoaXMua2Y9ITA7dmFyIGM9dGhpcy5ZYi5jb21wbGV0ZS0KdGhpcy5ZYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmKDEwPmMmJihjPTEwKSwwPmMmJihjPSJuZWdhdGl2ZSIpLGUudHJhY2soZixjLCEwKSl9fWNhdGNoKGgpe31pZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9Yz1bXTt0cnl7Yz10aGlzLnRzKHRoaXMuZy5MYSxhKX1jYXRjaChsKXtjPVtdfWZvcig7Yy5sZW5ndGg7KXRyeXt2YXIgbT1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5HZC5pbXByZXNzaW9ucyYmZS5rdChtLnVybCx0aGlzLkdkLmltcHJlc3Npb25zKT90aGlzLkVlKG0udXJsLG0udHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5Lbyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHthZElkOnRoaXMuR2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuRCgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKG0udXJsLG0udHlwZSl9Y2F0Y2gocil7fWlmKCFiKXRyeXt0aGlzLmcuTGE9dGhpcy5GcSh0aGlzLmcuTGEsYSl9Y2F0Y2gobil7fX19LEVlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuVC53YShhKSxjJiZhLlBvKGMpLGZ8fChmPXRoaXMuaWcpLHRoaXMuVC5IYShhLGYsdGhpcy5pZywhMSwhMCkpfSx0czpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LEZxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LG54OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLlloLmJpbmQodGhpcyl9LApZaDpmdW5jdGlvbigpe2UudyhrLmFnLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLmVkJiZlLlFhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLmFzKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5zYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5nLmxjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMuZy5sYyx0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKX19LmJpbmQodGhpcyksMjAwKX0sWGg6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPQp0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuUmMucmVwbGFjZSgiW3RpbWVdIixlLnRnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLlQuVmMmJihiPXRoaXMuVC5WYyk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy50Yy5iaW5kKHRoaXMpLDFFMyoKYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSx0YzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxDZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5ULlZjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuaWQ9dGhpcy56cTt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5EZCgpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnVjKCk7dGhpcy50YygpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5QYjtjLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Pdy5iaW5kKHRoaXMpKTpjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLk53LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRGQoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy51YygpO3RoaXMudGMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLk9iO2YuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2YuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTXcuYmluZCh0aGlzKSk6Zi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Mdy5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxoLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaC5zdHlsZS50b3A9Ii01MHB4IixoLnN0eWxlLnJpZ2h0PSIwcHgiLGguc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2guaWQ9dGhpcy5HaDtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2guaW5uZXJIVE1MPSIiO2IuYXBwZW5kQ2hpbGQoYyk7dGhpcy5nLmFmJiZiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoZik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkRkKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmphLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudWMoKTt0aGlzLnRjKCl9LmJpbmQodGhpcykpOwp0aGlzLmNvbnRyb2xzPXRoaXMuamEuYXBwZW5kQ2hpbGQoYik7InZwYWlkIiE9YSYmdGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay5iZyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuTGUoKSk7dGhpcy51YygpfX0sdWM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxEZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxOdzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYi5ILnBhdXNlZD8odGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsCiEwKSxlLncoay5WZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT3c6ZnVuY3Rpb24oKXt0aGlzLlBkP2Uub2EodGhpcy5PLCJjb250cm9sIiwicGxheSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwicGF1c2UiKX0sdGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLmIuSC5wYXVzZWR8fCh0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuVmQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5iLkgucGF1c2VkJiYodGhpcy5iLkgucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5PYyx0aGlzLmcuQix0aGlzLmIubS52KCksCnRoaXMuQygpLHRoaXMuRCgpKSl9LEx3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWQ/KHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuYi5ILm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudyhrLnJkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxNdzpmdW5jdGlvbigpe3RoaXMuYWM/ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJ1bm11dGUiKTplLm9hKHRoaXMuTywiY29udHJvbCIsIm11dGUiKX0sCkxlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PYik7dGhpcy5iLkgubXV0ZWR8fCh0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5yZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sJHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk9iKTt0aGlzLmIuSC5tdXRlZCYmKHRoaXMuYi5ILm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LFFiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLAp0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlFiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5RYik7dGhpcy5iZHx8dGhpcy5QY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuY2YoKSl9LGdlOmZ1bmN0aW9uKCl7dGhpcy5iZD0hMDt0aGlzLmtiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtiKSx0aGlzLmtiPSExKTtpZigoInByZXJvbGwiPT1lLlBhJiZ0aGlzLlBjfHwicG9zdHJvbGwiPT1lLlBhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlBhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5iLkw7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5DYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwpjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5oZSgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLmhlKCl9ZWxzZSB0aGlzLmhlKCl9LApoZTpmdW5jdGlvbigpe3RoaXMuZGY9ITA7dGhpcy5iLnNlKCk7dGhpcy5iLkJ2KCk7dGhpcy5NYj0hMTtlLncoay55cSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMucGUoKS54aCgpfSxwZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5iJiZ0aGlzLmIubSYmKGE9dGhpcy5iLm0pO3JldHVybiBhfSx6ZTpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFJmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUueGUodGhpcy52aWRlbywKYSk/dGhpcy55aCgpOnRoaXMudGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmYoKX0uYmluZCh0aGlzKSwxMDApKX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuZyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuZy5sYyxhLmR1cmF0aW9uPXRoaXMuZy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuZy5qYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLmVjJiYwPHRoaXMuZWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLmVjKSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlhwKyItIit0aGlzLmJmO3RoaXMuZyYmdGhpcy5nLnpnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuZy56ZygpKTtyZXR1cm4gYX0saWc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBQPWMueWt8fFA7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5sPXRoaXMuYVsxXTt0aGlzLkJvPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVs5XTt0aGlzLkhxPXRoaXMuYVs0XTt0aGlzLnp1PXRoaXMuYVs5XTt0aGlzLlFyPXRoaXMuYVszXTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzVdfWMua3U9YjtiLnByb3RvdHlwZT17TWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk5sOnRoaXMuQW8oYSl9LEFvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Cbzp0aGlzLmZtKGEpfSxmbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ206dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhxOnRoaXMueXUoYSl9LHl1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56dTp0aGlzLlByKGEpfSxQcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXI6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5Mczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB3Yj1jLmt1fHx3Yix2ZD1uZXcgd2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT12ZC5NbCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkJhPW51bGw7dGhpcy5aPVtdO3RoaXMuWD1udWxsO3RoaXMuZGM9dGhpcy5mYz0hMTt0aGlzLnRmPSIiO3RoaXMuc2Y9ITE7ZCYmZC5lbXB0eT90aGlzLll0KCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MuS249YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQplLmllKCksYjtiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHgodGhpcy51cmwpOmwud2EobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlFhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZXx8Yyl7YT1lLmRnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPAphLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC53YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLndhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSJ9bC5IYShiLHRoaXMuWHQuYmluZCh0aGlzKSx0aGlzLlV0LmJpbmQodGhpcykpfSx3ZzpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuQmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlBhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChkKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGYpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5QYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUGF8fHRoaXMub3QoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwub3coKSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sb3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxYdDpmdW5jdGlvbihhKXt0aGlzLnJ2KGEpO3RyeXt0aGlzLkJhPWEucmVzcG9uc2VYTUwsdGhpcy5CYXx8KHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5OYSh3LlNkKSl9dGhpcy5aPXRoaXMud2coKTt0aGlzLmZjPXRoaXMuZ2YoKTt0aGlzLmRjPXRoaXMuTGgoKTt0aGlzLloubGVuZ3RoP3RoaXMuemMoKTp0aGlzLnJhKHRoaXMuTmEody5HYyx7ZXJyb3I6dGhpcy5zZj9ELlJkOkQuQWZ9KSl9LFl0OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwKKHRoaXMuQmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk5hKHcuU2QpKX10aGlzLlo9dGhpcy53ZygpO3RoaXMuZmM9dGhpcy5nZigpO3RoaXMuZGM9dGhpcy5MaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy56YygpOnRoaXMucmEodGhpcy5OYSh3LkdjLHtlcnJvcjp0aGlzLnNmP0QuUmQ6RC5BZn0pKX0sVXQ6ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuTmEody56Zix7ZGVwdGg6YX0pKX0semM6ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5aLnNoaWZ0KCk7dGhpcy5xdCgpP3RoaXMueXcoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5GZygpLGcse0FkU3lzdGVtOnRoaXMuWnIoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5yYSh0aGlzLk5hKHcuQ2YpKTooYT0wLHRoaXMuZXgoKSYmdGhpcy5RZSh0aGlzLkFxKCkpKX0sTWU6ZnVuY3Rpb24oKXt0aGlzLmZjPyh0aGlzLmZjPTE8dGhpcy5aLmxlbmd0aCwKdGhpcy5aLmxlbmd0aCYmdGhpcy56YygpKTp0aGlzLnBhcmVudC5NZSgpfSxnaDpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMuZGM9MTx0aGlzLloubGVuZ3RoLHRoaXMuWi5sZW5ndGgmJnRoaXMuemMoKSk6dGhpcy5wYXJlbnQuZ2goKX0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52dygpP3RoaXMudXcoKT8hMDooLTEhPXRoaXMucmMoKT90aGlzLnJhKHRoaXMuTmEody52ZikpOnRoaXMucmEodGhpcy5OYSh3LnpqKSksITEpOih0aGlzLnJhKHRoaXMuTmEody5HYyxELkJmKSksITEpfSxRZTpmdW5jdGlvbihhKXthLkxhPWEuTGEuY29uY2F0KHRoaXMuSWUoKSk7YS5qYj1hLmpiP2EuamI6dGhpcy5mYzthLmNjPWEuY2M/YS5jYzp0aGlzLmRjO3RoaXMucGFyZW50LlFlKGEpfSxBcTpmdW5jdGlvbigpe3ZhciBhPW5ldyB4YjthLmR1cmF0aW9uPXRoaXMucmMoKTthLlU9dGhpcy5DZygpO2EubGM9dGhpcy5icygpO2Eub3JpZ2luPXRoaXM7YS5CPXRoaXMuWXIoKTthLmFmPXRoaXMucnMoYS5kdXJhdGlvbik7CnJldHVybiBhfSxyYTpmdW5jdGlvbihiKXt0aGlzLlgmJihiLkxhPWIuZXJyb3IuY29kZSE9dy52Zi5jb2RlP2IuTGEuY29uY2F0KHRoaXMuY3MoKSk6Yi5MYS5jb25jYXQodGhpcy5scygpKSk7dGhpcy5aLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LkliJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuSWImJnRoaXMucGFyZW50LkliKGIpLGE9MCx0aGlzLnpjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5yYSYmdGhpcy5wYXJlbnQucmEoYiksYT0wKX0sSWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuSWIoYSl9LGtnOmZ1bmN0aW9uKGEsYil7dGhpcy5yYSh0aGlzLk5hKGEsYikpfSxOYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB5YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LHl3OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sdnc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkNnKCkubGVuZ3RofSwKdXc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnJjKCl9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5aLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sTGg6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlomJjI8PXRoaXMuWi5sZW5ndGgmJiF0aGlzLmdmKCkmJihhPSEwKTtyZXR1cm4gYX0scnY6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxxdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LEZnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sClpyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2UodGhpcy5YLCJBZFN5c3RlbSIpfSxJZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLlNnKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmJiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sU2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5TZyhhLnBhcmVudE5vZGUpOiExfSxsczpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sY3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LENnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksVWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHR5OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLAp1cmw6dGhpcy5iYihhW2NdKX0pO3RyeXt2YXIgZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5VYyktTWF0aC5hYnMoNzAwLWIuVWMpfSksYj1kLmNvbmNhdChnKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz0KYj10aGlzLmpkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxyYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmJiKHRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scnM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5kdyhkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJgoib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmpkKGEpOiIifSxqZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFU9Yy5Lbnx8VTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meT10aGlzLmFbNl07dGhpcy5acz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtleTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmZ5OnRoaXMuWXMoYSl9LFlzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5aczp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMudml8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLmV5KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5VPVtdO3RoaXMubGM9IiI7dGhpcy5CPXRoaXMuY2M9dGhpcy5qYj0hMTt0aGlzLnRlPXRoaXMub3JpZ2luPW51bGx9Yy51bT1iO2IucHJvdG90eXBlPXt1cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxqczpmdW5jdGlvbigpe2lmKCF0aGlzLnRlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSwKYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnRlPWFbY10pfXJldHVybiB0aGlzLnRlfSx6ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5qcygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx1czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMudW18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFqPXRoaXMuYVs0XTt0aGlzLldwPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzRdfWMuVnE9YjtiLnByb3RvdHlwZT17UGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFqOnRoaXMuVnAoYSl9LFZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XcDoKdGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBBYj1jLlZxfHxBYix4ZD1uZXcgQWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT14ZC5Qaig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LHpqOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxHYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnRhOiJFTVBUWV9WQVNUIn0sQ2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsdGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHpmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp0YToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIix0YToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LGp5Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHRhOiJNRURJQUZJTEVfRVJST1IifSx2Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17QWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sbHk6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHRhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsdGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVnU9dGhpcy5hWzldO3RoaXMucWs9dGhpcy5hWzNdO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlF4PXRoaXMuYVs2XTt0aGlzLkF0PXRoaXMuYVsyXTt0aGlzLlBuPXRoaXMuYVsyXTt0aGlzLlhzPXRoaXMuYVsyXTt0aGlzLnptPXRoaXMuYVszXTt0aGlzLm92PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzhdfWMuZ3k9YjtiLnByb3RvdHlwZT17VXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZ1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5xazoKdGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuUHgoYSl9LFB4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ReDp0aGlzLnp0KGEpfSx6dDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXQ6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBuOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Yczp0aGlzLnltKGEpfSx5bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem06dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm92OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgQmI9Yy5neXx8QmIseWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9eWQuVXUoNCk7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuY2Q9Yjt0aGlzLkxhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Yaj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIHliPWMuWGp8fHliO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ5PXRoaXMuYVs1XTt0aGlzLlZ3PXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzldfWMudHQ9YjtiLnByb3RvdHlwZT17YXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmJ5OnRoaXMuVXcoYSl9LFV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIENiPWMudHR8fENiLHpkPW5ldyBDYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT16ZC5heSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLm09YTt0aGlzLmFiPWEueGcoKTt0aGlzLkw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5MLmlkPWUuZ2EoMTApO3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkE9e307dGhpcy5iZT0hMTt0aGlzLm9iPVtdfWMuRmo9YjtiLnByb3RvdHlwZT17dWc6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxmPTAsYj0wLGU9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGY9Yi5sZWZ0LGI9Yi50b3ApO2U9e3g6ZiwKeTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudWcoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLk5zKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYKKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxodzpmdW5jdGlvbigpe3RoaXMuYmU9ITB9LFVoOmZ1bmN0aW9uKCl7dGhpcy5IPUMucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkguaWQ9ImFkWGRpc3BsYXkiLHRoaXMuSC5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxtaDpmdW5jdGlvbigpe3RoaXMubS5wYXVzZSgpO2UudyhrLiRjLHRoaXMubS52KCkpfSxCdjpmdW5jdGlvbigpe3RoaXMuYmV8fCh0aGlzLm0ucGxheSgpLGUudyhrLmFkLHRoaXMubS52KCkpKX0sQ2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMubS5wYXVzZSgpO3RoaXMuTC5zdHlsZS56SW5kZXg9YTt0aGlzLkwuc3R5bGUubWFyZ2luTGVmdD0KImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5MLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5MLnN0eWxlLmJveFNpemluZz10aGlzLmFiLnN0eWxlLmJveFNpemluZzt0aGlzLkwuc3R5bGUud2lkdGg9dGhpcy5hYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD10aGlzLmFiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5ILnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5hYik7dGhpcy5tLlJiJiZ0aGlzLm0uUmIoKT90aGlzLm0ueGcoKS5hcHBlbmRDaGlsZCh0aGlzLkwpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5MKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMubS5leGl0RnVsbHNjcmVlbigpfSwKTnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LG1nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sTGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tZyh0aGlzLmFiKTtpZihiLnghPXRoaXMuQS54fHxiLnkhPXRoaXMuQS55fHxiLnBvc2l0aW9uIT10aGlzLkEucG9zaXRpb258fGIud2lkdGghPXRoaXMuQS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuQS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5BLndpZHRoJiYKMDx0aGlzLkEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZSgpO3JldHVybn10aGlzLkE9Yjt0aGlzLm0uUmIoKT8odGhpcy5MLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5MLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuTC5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuTC5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuTC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5MLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuTC5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9iLmxlbmd0aDthKyspdGhpcy5vYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkhoKHRoaXMuTCkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTGIuYmluZCh0aGlzKSwxMCl9LE5vOmZ1bmN0aW9uKGEpe3RoaXMub2J8fAoodGhpcy5vYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMub2IucHVzaChhKX0sc2U6ZnVuY3Rpb24oKXt0aGlzLkwmJnRoaXMuTC5wYXJlbnROb2RlJiZ0aGlzLkwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5MKTt0aGlzLkgmJnRoaXMuSC5wYXVzZSYmdGhpcy5ILnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTz1jLkZqfHxPLEM9W10sRGI9MDsxMDA+RGI7RGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUuZ2EoMTApO0wuY29udHJvbHM9ITA7Qy5wdXNoKEwpfXZhciBIPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCnopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlN1PXRoaXMuYVsxXTt0aGlzLlh2PXRoaXMuYVs3XTt0aGlzLmdxPXRoaXMuYVs3XTt0aGlzLmVwPXRoaXMuYVsxXTt0aGlzLmZrPXRoaXMuYVs2XTt0aGlzLkV3PXRoaXMuYVs3XTt0aGlzLnF2PXRoaXMuYVs1XTt0aGlzLk1qPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuTXM9YjtiLnByb3RvdHlwZT17UnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlN1OnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLmZxKGEpfSxmcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3E6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuZWsoYSl9LGVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mazp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLkV3OnRoaXMucHYoYSl9LHB2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xdjp0aGlzLkxqKGEpfSxMajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYj1jLk1zfHxFYixBZD1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1BZC5SdSg0KTsoZnVuY3Rpb24oYyl7Yy5rbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuQWQoYik7CnRoaXMuZ2coKX0sQWQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuRmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBGYj1jLmttfHxGYjsoZnVuY3Rpb24oYyl7Yy5qbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkdiPXRoaXMuR2J8fCExO3RoaXMuSWY9dGhpcy5LZj10aGlzLk9nPXRoaXMucWE9dGhpcy5sZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5JcihhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubGY9ITA7dGhpcy5PZyYmdGhpcy5aZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnNiO2EmJmEuTWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5XYygpO3RoaXMuT2c9ITA7dGhpcy5aZigpfS5iaW5kKHRoaXMpKTt0aGlzLlRmKCl9LFpmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2Ipe3RoaXMuV2MoKTtpZighdGhpcy5sZiYmIXRoaXMuV2MoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5sZiYmdGhpcy5JZiYmIXRoaXMuS2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxXYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sRGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sVGY6ZnVuY3Rpb24oKXtpZih0aGlzLldjKCkpe3ZhciBiPXRoaXMuRGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5LZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLklmPWIucXl9dGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRmKCl9LmJpbmQodGhpcyksMTAwKX0sdXk6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuR3koKTohMX0scmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLnJjKCk6LTF9LG1zOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LElyOmZ1bmN0aW9uKGIsYSl7dGhpcy5HYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkdifHwzMDI9PXRoaXMuR2I/dGhpcy5xYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuR2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9LFpjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT8odGhpcy5zKCksdGhpcy5lYSgpKTpiLm9kKCk/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMubXMoYik/KHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgR2I9Yy5qbXx8R2I7KGZ1bmN0aW9uKGMpe2MubG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxudDpmdW5jdGlvbigpe3dpbmRvdy5PTy5DbS56by54bz93aW5kb3cuT08uQ20uem8ueG8ub3koZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubnQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuT2EoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEZiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBHYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgSGI9Yy5sbXx8SGIsSWI9bmV3IEhiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml5PXRoaXMuYVszXTt0aGlzLlRsPXRoaXMuYVs2XTt0aGlzLmxvPXRoaXMuYVs5XTt0aGlzLmdyPXRoaXMuYVs2XTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmw9dGhpcy5hWzddfWMuR2k9YjtiLnByb3RvdHlwZT17aHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLml5OnRoaXMuU2woYSl9LApTbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGw6dGhpcy5rbyhhKX0sa286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ncjp0aGlzLmhyKGEpfSxocjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaXI6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYj1jLkdpfHxKYixCZD1uZXcgSmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1CZC5oeSg0KTsoZnVuY3Rpb24oYyl7Yy5paj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLm1hPSExO3RoaXMuR2coKX0sR2c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmCihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSwKbGE6ZnVuY3Rpb24oKXt0aGlzLnNoKCl9LHNoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5OJiYoMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgS2I9Yy5panx8S2I7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sVWY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy5zKCJlbXB0eSIpLHRoaXMuZWEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5lYSgpOnRoaXMudSgpKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuVWYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5VZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5oanx8TGI7KGZ1bmN0aW9uKGMpe2Muamo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8CihiLkFkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLksoYiksKG5ldyBMYihiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXt0aGlzLktyfHwodGhpcy5Lcj0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMudmgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5qanx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkV1PXRoaXMuYVsxXTt0aGlzLnRuPXRoaXMuYVs5XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs4XTt0aGlzLmt4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVs5XX1jLkJwPWI7Yi5wcm90b3R5cGU9e0R1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FdTp0aGlzLnNuKGEpfSxzbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudG46dGhpcy5WaihhKX0sVmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Xajp0aGlzLkxyKGEpfSxMcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTXI6dGhpcy5qeChhKX0sang6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgTmI9Yy5CcHx8TmIsQ2Q9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPUNkLkR1KDQpOyhmdW5jdGlvbihjKXtjLmVuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7CnZhciBXPWMuZW58fFc7KGZ1bmN0aW9uKGMpe2MuZG49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5RZigiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuUWYoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5xdShhKX0uYmluZCh0aGlzKSk7eS5FcygpfSxxdTpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLnMoKTt0aGlzLmVhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPwohMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBYPWMuZG58fFg7KGZ1bmN0aW9uKGMpe2MuZm49dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuc2QmJihiPWUuS3EoYix0aGlzLnNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFcoZCk7CmlmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuc2R8fCh0aGlzLnNkPVtdKSx0aGlzLnNkLnB1c2goYlthXSksZD1uZXcgVyhoKSx0aGlzLkooZCl8fCh0aGlzLksoZCksZj1uZXcgWChkLHRoaXMuRyksZi5jKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxRZjpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSx6dzpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYKIXRoaXMuZGFbYV0pdGhpcy55Y3x8KHRoaXMueWM9W10pLHRoaXMueWMucHVzaChiKSx0aGlzLkF2KCkmJih0aGlzLnpkKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LEVzOmZ1bmN0aW9uKCl7aWYodGhpcy55Yylmb3IodmFyIGI9MDtiPHRoaXMueWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy55Y1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmRhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5kYVtjXVtkXVtmXShhKX19LAp2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lnp3KGIpfX0pfSkoYyk7dmFyIE9iPWMuZm58fE9iLHk9bmV3IE9iKHEpO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWs9dGhpcy5hWzRdO3RoaXMuYXc9dGhpcy5hWzhdO3RoaXMuU209dGhpcy5hWzFdO3RoaXMuZnY9dGhpcy5hWzFdO3RoaXMuWHc9dGhpcy5hWzRdO3RoaXMuU3E9dGhpcy5hWzVdO3RoaXMuRXI9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzddO3RoaXMuVWk9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtsazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWs6dGhpcy4kdihhKX0sJHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5hdzp0aGlzLlJtKGEpfSxSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5ldihhKX0sZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZ2OnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydzp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU3E6dGhpcy5EcihhKX0sRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVyOnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5SdDp0aGlzLlRpKGEpfSxUaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYj1jLnNqfHxQYixEZD1uZXcgUGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KRGQubGsoNCk7KGZ1bmN0aW9uKGMpe2MuZWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLmVqfHxRYjsoZnVuY3Rpb24oYyl7Yy5maj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMucygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUmI9Yy5manx8UmI7KGZ1bmN0aW9uKGMpe2MuZ2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgUWIoZCk7dGhpcy5KKGUpfHwodGhpcy5LKGUpLChuZXcgUmIoZSx0aGlzLkcpKS5jKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkphW2IucWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5nanx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRpPXRoaXMuYVsyXTt0aGlzLnVwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzJdfWMuanI9YjtiLnByb3RvdHlwZT17Q2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYj1jLmpyfHxVYixFZD1uZXcgVWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1FZC5DaSg0KTsoZnVuY3Rpb24oYyl7Yy5YbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlMoYik7dGhpcy5WKGEpO3RoaXMudHYodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sdHY6ZnVuY3Rpb24oYixhKXtiJiZiLnBhdXNlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnBhdXNlRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEudW5tdXRlJiYKdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFBnOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIFZiPWMuWGx8fFZiOyhmdW5jdGlvbihjKXtjLldsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5laT0hMX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5laSYmKHRoaXMuRigpLHRoaXMuZWk9ITAsdGhpcy5LYSgpKTthLkZhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRigpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBXYj1jLldsfHxXYjsoZnVuY3Rpb24oYyl7Yy5ZbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGI9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBWYihiW2RdKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBXYihjLHRoaXMuRykpLmMoKSl9fWVsc2UgdGhpcy5JKCl9fSl9KShjKTt2YXIgWGI9Yy5ZbHx8WGIsWT1uZXcgWGIocSk7WS5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSWo9dGhpcy5hWzZdO3RoaXMueXA9dGhpcy5hWzJdO3RoaXMuQ3E9dGhpcy5hWzddO3RoaXMua2s9dGhpcy5hWzFdO3RoaXMuQm09dGhpcy5hWzhdO3RoaXMuWXg9dGhpcy5hWzVdO3RoaXMueWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzRdfWMuRnQ9YjtiLnByb3RvdHlwZT17SGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklqOnRoaXMueHAoYSl9LAp4cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnlwOnRoaXMuQnEoYSl9LEJxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DcTp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua2s6dGhpcy5BbShhKX0sQW06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkJtOnRoaXMuWHgoYSl9LFh4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ZeDp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBZYj1jLkZ0fHxZYixGZD1uZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1GZC5Iaig0KTsoZnVuY3Rpb24oYyl7Yy5Sbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgWmI9Yy5Sbnx8WmI7KGZ1bmN0aW9uKGMpe2MuUW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sSmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LHN2OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5XYXx8KHRoaXMuV2E9W10pO3RoaXMuV2EucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5lYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLmdjPSEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxjOmZ1bmN0aW9uKCl7dGhpcy51KCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnhhP3RoaXMuc3YodGhpcy54YSk6KHRoaXMueGE9dGhpcy5KYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDEwMCkpfSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnhhKXt0aGlzLkYoKTtyZXR1cm59aWYoIXRoaXMuZ2Mpe3RoaXMuRigpO3JldHVybn1iPSEwO2lmKHRoaXMuV2EmJgp0aGlzLldhLmxlbmd0aCYmMTx0aGlzLldhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuV2EubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuV2FbYV0mJjMwMyE9dGhpcy5XYVthXSYmNDAzIT10aGlzLldhW2FdJiYoYj0hMSk7aWYoYil0aGlzLnMoImVtcHR5IiksdGhpcy5lYSgpO2Vsc2V7dGhpcy5GKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgJGI9Yy5Rbnx8JGI7KGZ1bmN0aW9uKGMpe2MuU249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5JYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBaYihiLml0ZW0oYSkpO3RoaXMuSihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSyhjKSwKKG5ldyAkYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgYWM9Yy5Tbnx8YWMsYmM9bmV3IGFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl1PXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs2XTt0aGlzLkN0PXRoaXMuYVsxMF07dGhpcy5wcj10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuYXI9dGhpcy5hWzFdO3RoaXMuaXY9dGhpcy5hWzldO3RoaXMudXI9dGhpcy5hWzZdO3RoaXMuZ3A9dGhpcy5hWzZdO3RoaXMucnI9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudXQ9YjtiLnByb3RvdHlwZT17SHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkl1OnRoaXMuRnUoYSl9LEZ1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HdTp0aGlzLkJ0KGEpfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Q6dGhpcy5vcihhKX0sCm9yOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wcjp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy4kcShhKX0sJHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFyOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5pdjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXI6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmdwOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ycjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNjPWMudXR8fGNjLEdkPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUdkLkh1KDQpOyhmdW5jdGlvbihjKXtjLmJsPQpuLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTiYmKDAsdGhpcy5OKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpO3ZhciBkYz0KYy5ibHx8ZGM7KGZ1bmN0aW9uKGMpe2MuYWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuY2koKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnJnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5yZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5NbygpfS5iaW5kKHRoaXMpKSx0aGlzLmRpPSExLHRoaXMuS3g9MUUzLAp0aGlzLm9oPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxyZzpmdW5jdGlvbigpe3RoaXMub2guZG9uZXx8KHRoaXMub2guZG9uZT0hMCx0aGlzLmRpPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jaSgpfS5iaW5kKHRoaXMpLHRoaXMuS3gpKX0sTW86ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGkpO3RoaXMucygpfSxjaTpmdW5jdGlvbigpe3RoaXMueWEoKT8odGhpcy5zKCksdGhpcy5lYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRigpKX0sQWc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5BZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLkFnKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBlYz1jLmFsfHxlYzsoZnVuY3Rpb24oYyl7Yy5jbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk9hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuT2Eod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGRjKGMpLHRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IGVjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGZjPWMuY2x8fGZjLGdjPW5ldyBmYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW49dGhpcy5hWzhdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMuTXg9dGhpcy5hWzddO3RoaXMucmw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMTBdfWMudnU9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVuOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbTp0aGlzLkx4KGEpfSxMeDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuTXg6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnJsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgaGM9Yy52dXx8aGMsSGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLlRuKDQpOyhmdW5jdGlvbihjKXtjLmJuPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBpYz1jLmJufHxpYzsoZnVuY3Rpb24oYyl7Yy5hbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMua2MoKX0sa2M6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5DZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2UoKSYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2MoKX0uYmluZCh0aGlzKSwxMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LAp1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5hbnx8amM7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBpYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgamMoYiwKdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLmNufHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGw9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbOV19Yy5paT1iO2IucHJvdG90eXBlPXtPbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmlpfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5PbCg0KTsoZnVuY3Rpb24oYyl7Yy5ObT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuUmU9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLll1KCl9LmJpbmQodGhpcyksNTAwKX0sWXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuUmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuUmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxldzpmdW5jdGlvbigpe3RoaXMuUmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLk5tfHxuYzsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuJGI9MH0sYzpmdW5jdGlvbigpe3RoaXMuY3U9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy4kYnx8KHRoaXMuJGI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy4kYnx8dGhpcy4kYisrLHRoaXMuJGI8PXRoaXMuY3U/KHRoaXMuJGIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLmV3KCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgb2M9Yy5NbXx8b2M7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBwYz1jLk9tfHxwYyxxYz1uZXcgcGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHA9dGhpcy5hWzhdO3RoaXMuV249dGhpcy5hWzhdOwp0aGlzLm14PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLmR4PXRoaXMuYVs2XTt0aGlzLmZ0PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLnl0PXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzddfWMubnc9YjtiLnByb3RvdHlwZT17Q3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Xbjp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubXg6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFpOnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5keDp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRyOnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgcmM9Yy5ud3x8cmMsSmQ9bmV3IHJjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9SmQuQ3AoNCk7KGZ1bmN0aW9uKGMpe2MuS209bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLk4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgc2M9Yy5LbXx8c2M7KGZ1bmN0aW9uKGMpe2MuSm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7CmEmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMuS2EoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy52cSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmdkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5TdCgpOnRoaXMua2MoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2YoKXx8KHRoaXMubygiY29udGVudHBsYXkiKSx0aGlzLnUoITApKX0uYmluZCh0aGlzKSwxRTMpfSx2cTpmdW5jdGlvbigpe3RoaXMuR2YoKXx8dGhpcy51KCEwKX0sU3Q6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZCgpOyFiLnZhJiZiLlomJmIubnkmJmIucHkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfSxrYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnMoKSx0aGlzLmVhKCkpOih0aGlzLm8oImFkZXJyb3IiLGIpLHRoaXMudSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtjKCl9LmJpbmQodGhpcyksMTAwKX0sZ2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5raClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRmEoKS5pZCwKYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PWEmJih0aGlzLmtoPWJbY10pO3JldHVybiB0aGlzLmtofSxDZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSx1OmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5nZCgpLmFkc0xvYWRlcj90aGlzLkYoITApOnRoaXMuRigpOnRoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB0Yz1jLkptfHx0YzsoZnVuY3Rpb24oYyl7Yy5MbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBzYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IHRjKGMsdGhpcy5HKSkuYygpKX1yZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIHVjPWMuTG18fHVjLHZjPW5ldyB1YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbM107dGhpcy5oaT10aGlzLmFbMTBdO3RoaXMuWW89dGhpcy5hWzEwXTt0aGlzLlF1PXRoaXMuYVsxMF07dGhpcy53dD10aGlzLmFbNV07dGhpcy5IbT10aGlzLmFbN107dGhpcy5NdT10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVsyXX1jLkF3PWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdTp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSWk6dGhpcy5naShhKX0sZ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhpOnRoaXMuWG8oYSl9LApYbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWW86dGhpcy5QdShhKX0sUHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlF1OnRoaXMudnQoYSl9LHZ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53dDp0aGlzLkdtKGEpfSxHbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSG06dGhpcy5MdShhKX0sTHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5NdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIHdjPWMuQXd8fHdjLEtkPW5ldyB3YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUtkLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKRSYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuVihhKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUmE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYjpmdW5jdGlvbigpe3JldHVybiEwfSxGYTpmdW5jdGlvbigpe3ZhciBiO0U/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFo9Yy52bHx8WjsoZnVuY3Rpb24oYyl7Yy51bD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5UZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlRlPWIuaWQpO0U/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlRlJiZiIT10aGlzLlRlfHwiYWRlcnJvciIhPWEuZXZlbnR8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLm8oImFkZXJyb3IiLGEuSXkpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYWE9Yy51bHx8YWE7KGZ1bmN0aW9uKGMpe2Mud2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0KImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihFKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFooYiksYi5tYXx8dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBaKGIpLGIubWE/dGhpcy56ZCgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEUseGM9Yy53bHx8eGMseWM9bmV3IHhjKGZ1bmN0aW9uKGMsYil7Yy5wYXVzZSgpO2lmKGwueWIubGVuZ3RoKXt2YXIgYT1sLnliLnNoaWZ0KCk7CmlmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9ZS5Pdih7IltMT0FEU0NSSVBUXSI6ZS5nYSgxMCksIltVVElMU10iOmUuZ2EoMTApLCJbQ0FMTEJBQ0tdIjplLmdhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS5haC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuYWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHEoYyxiKX1lbHNlIHEoYyxiKX0pO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlZ4PXRoaXMuYVs4XTt0aGlzLlJ3PXRoaXMuYVs4XTt0aGlzLmt3PQp0aGlzLmFbMl07dGhpcy5lbz10aGlzLmFbNV07dGhpcy50bT10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs5XX1jLlJrPWI7Yi5wcm90b3R5cGU9e1V4OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WeDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnc6dGhpcy5pdyhhKX0saXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmt3OnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5lbzp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudG06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yz1jLlJrfHx6YyxMZD1uZXcgemMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1MZC5VeCg0KTsoZnVuY3Rpb24oYyl7Yy54bj0Kbi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlYoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLmd1PWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxPeTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiYKYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3V9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuaWIoYil9LmJpbmQodGhpcykpfSxpYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuTiYmdGhpcy5OKCkpfX0pfSkoYyk7dmFyIE09Yy54bnx8TTsoZnVuY3Rpb24oYyl7Yy53bj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMubmUpaWYodGhpcy50Ynx8KHRoaXMudGI9MCksdGhpcy50YisrLDE1PHRoaXMudGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuUXYoKToKdGhpcy51KCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5uZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTj1jLndufHxOOyhmdW5jdGlvbihjKXtjLnluPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBOKGIsdGhpcy5HKSxiLmMoKSkpO3RoaXMuemQoKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnlufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHI9CnRoaXMuYVsxMF07dGhpcy5FcT10aGlzLmFbN107dGhpcy5uaj10aGlzLmFbMl07dGhpcy53aj10aGlzLmFbNF07dGhpcy51aj10aGlzLmFbMV07dGhpcy53cD10aGlzLmFbNl07dGhpcy5CaT10aGlzLmFbMTBdO3RoaXMubXY9dGhpcy5hWzddO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbMV19Yy5Gaz1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHI6dGhpcy5EcShhKX0sRHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5FcTp0aGlzLm1qKGEpfSxtajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmo6dGhpcy52aihhKX0sdmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53ajp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWo6dGhpcy52cChhKX0sdnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLndwOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CaToKdGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm12OnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5MbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIENjPWMuRmt8fENjLE1kPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU1kLmtyKDQpOyhmdW5jdGlvbihjKXtjLm9sPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmVnPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5WKGEpOnRoaXMuZmEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVnfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpOwp0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTj8oMCx0aGlzLk4pKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7YnE6ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5lZz1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7YnE6ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpOwp2YXIgRGM9Yy5vbHx8RGM7KGZ1bmN0aW9uKGMpe2Mubmw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sTXk6ZnVuY3Rpb24oKXt9LHZ2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWYobmV3IGZ1bmN0aW9uKCl7fSk7YS5reT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi52dihhKTt3aW5kb3cuYmU9Yn0sYzpmdW5jdGlvbigpe3RoaXMudXZ8fCh0aGlzLnV2PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmV8fCh0aGlzLnZlPTEpO2lmKDIwPHRoaXMudmUpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmCihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuU2EoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy52ZSsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksNTApfX0sU2E6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiZiLm8oImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT0hMSxjPWE9ITE7Yi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlkoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSl9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LAp1OmZ1bmN0aW9uKGIpe3RoaXMuRihiKX19KX0pKGMpO3ZhciBFYz1jLm5sfHxFYzsoZnVuY3Rpb24oYyl7Yy5wbD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgRGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLm1hfHx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBFYyhjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRmM9Yy5wbHx8RmMsR2M9bmV3IEZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Iaz10aGlzLmFbNF07dGhpcy5Wcz10aGlzLmFbMl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5SbD10aGlzLmFbM107dGhpcy5wbz10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbM119Yy4kcz1iO2IucHJvdG90eXBlPXtHazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSGs6dGhpcy5VcyhhKX0sVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZzOnRoaXMuTmooYSl9LE5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Pajp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUmw6dGhpcy5vbyhhKX0sb286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBvOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy4kc3x8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy5BPU5kLkdrKDQpOyhmdW5jdGlvbihjKXtjLmZsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuZmx8fGJhOyhmdW5jdGlvbihjKXtjLmRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLkxnPTA7dGhpcy5XPXRoaXMuV3x8ITE7CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnZjPXRoaXMueGE9dGhpcy5TYz0hMTt0aGlzLnVoPWUud2IoMTApO3RoaXMuVWcoKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlNhKCksITA7dGhpcy5MZysrO2lmKDEwPHRoaXMuTGcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5VZy5iaW5kKHRoaXMpLDEwMCksITF9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52YTtpZihiKXt2YXIgYT0iYWRFcnJvciIsCmM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApOwp0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmCmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMucygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGNhPWMuZGx8fGNhOyhmdW5jdGlvbihjKXtjLmdsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBJYz1jLmdsfHxJYyxKYz0KbmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk9yPXRoaXMuYVsyXTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnpuPWI7Yi5wcm90b3R5cGU9e05yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Pcjp0aGlzLlV2KGEpfSxVdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBLYz1jLnpufHxLYyxPZD1uZXcgS2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1PZC5Ocig0KTsoZnVuY3Rpb24oYyl7Yy5haz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYik6dGhpcy5mYSgpKTp0aGlzLmZhKCk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sb2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIExjPWMuYWt8fExjOyhmdW5jdGlvbihjKXtjLiRqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwokcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLAp0aGlzLnUoKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIE1jPWMuJGp8fE1jOyhmdW5jdGlvbihjKXtjLmJrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLk9hKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgTGMoZCksZC5tYXx8dGhpcy5KKGQpfHwodGhpcy5LKGQpLChuZXcgTWMoZCx0aGlzLkcpKS5jKCkpOwplbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5jPWMuYmt8fE5jLE9jPW5ldyBOYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EbD10aGlzLmFbOV07dGhpcy5Hdz10aGlzLmFbNl07dGhpcy5udT10aGlzLmFbOF07dGhpcy5Gdj10aGlzLmFbOV07dGhpcy5jcj10aGlzLmFbNF07dGhpcy5GaT10aGlzLmFbNV07dGhpcy5kaj10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbMl07dGhpcy5YcT10aGlzLmFbNF07dGhpcy5pbD10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLnhyPWI7Yi5wcm90b3R5cGU9e0NsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EbDp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3c6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm51OnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuRnY6dGhpcy5icihhKX0sYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZGo6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpzOnRoaXMuV3EoYSl9LFdxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5YcTp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWw6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBQYz1jLnhyfHxQYyxQZD1uZXcgUGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1QZC5DbCg0KTsoZnVuY3Rpb24oYyl7Yy5oaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5WKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgUWM9Yy5oa3x8UWM7KGZ1bmN0aW9uKGMpe2MuZ2s9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuV2YoKX0sV2Y6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldmKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgUmM9Yy5na3x8UmM7KGZ1bmN0aW9uKGMpe2MuaWs9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFFjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSihiKSl7dGhpcy5LKGIpOyhuZXcgUmMoYix0aGlzLkcpKS5jKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBTYz1jLmlrfHxTYyxUYz1uZXcgU2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnE9dGhpcy5hWzJdO3RoaXMuenI9dGhpcy5hWzEwXTt0aGlzLnVpPQp0aGlzLmFbNF07dGhpcy53cj10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs1XX1jLiRrPWI7Yi5wcm90b3R5cGU9e01xOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnE6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpyOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBVYz1jLiRrfHxVYyxRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5NcSg0KTsoZnVuY3Rpb24oYyl7Yy5taT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTsKYj8odGhpcy5TKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLmZhKCkpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIFZjPWMubWl8fFZjOyhmdW5jdGlvbihjKXtjLmxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuY2UoKTt0aGlzLlNmKCl9LApZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMDt0aGlzLnMoImVtcHR5IHZhc3QiKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5zKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlNmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5jZS5iaW5kKHRoaXMpLDEwMCl9LGNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKInBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2EuYmluZCh0aGlzKSwxMCksdGhpcy5zKCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy51KCk6dGhpcy51KCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNlLmJpbmQodGhpcyksMTAwKX19LHU6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5LYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMubGl8fFdjOyhmdW5jdGlvbihjKXtjLm5pPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuSSgpfX0pfSkoYyk7dmFyIFhjPWMubml8fFhjLFljPW5ldyBYYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obz10aGlzLmFbNF07dGhpcy5vbT10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbOV07dGhpcy5lbT10aGlzLmFbNV07dGhpcy5FbT10aGlzLmFbOF07dGhpcy5Ebj10aGlzLmFbM107dGhpcy4kcD10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkltPWI7Yi5wcm90b3R5cGU9e2ZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaG86dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5vbTp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnE6dGhpcy5kbShhKX0sZG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVtOnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FbTp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG46dGhpcy5acChhKX0sWnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubDphfX19KShjKTt2YXIgWmM9Yy5JbXx8WmMsUmQ9bmV3IFpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UmQuZm8oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuV2c9dGhpcy5ZZz10aGlzLlhnPSExO3RoaXMudWQ9W107dGhpcy5XZT0Ke0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdmM/bnVsbDp2YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBCYz9udWxsOkJjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeWM/bnVsbDp5YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgT2M/bnVsbDpPYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHFjP251bGw6cWMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJiP251bGw6cmIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYmM/bnVsbDpiYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhPwpudWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT9udWxsOll9fWMud209YjtiLnByb3RvdHlwZT17YzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5vcyhhKTpbXSxiO3RoaXMuWWc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuemgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLldnKWJyZWFrO2I9dGhpcy5XZVtjXTt0aGlzLm9mKGIpJiYodGhpcy51ZC5wdXNoKGIpLHRoaXMuemgoYikpfX0sb2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxvczpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPQowO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5vZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLm9mKGEpJiZhLmMoKX0sZnc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJiF0aGlzLlhnKWZvcih0aGlzLldnPSEwLGE9MDthPHRoaXMudWQubGVuZ3RoO2ErKyl0aGlzLnVkW2FdLkFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWRbYV0uQWIpfX19KShjKTt2YXIgJGM9Yy53bXx8JGMsSz1uZXcgJGM7Sy5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2k9dGhpcy5hWzldO3RoaXMuJGw9dGhpcy5hWzEwXTt0aGlzLk1rPXRoaXMuYVsxMF07dGhpcy5UeD10aGlzLmFbMl07dGhpcy5idD10aGlzLmFbOV07dGhpcy5xeD10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVsxXX1jLlFtPWI7Yi5wcm90b3R5cGU9CntOaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT2k6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Nazp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVHg6dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ0OnRoaXMucHgoYSl9LHB4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIGFkPWMuUW18fGFkLFNkPW5ldyBhZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLk5pKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mClJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnFjKGsuZngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnFjKGsuanUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRik7dmFyIFRkPUYuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksCmhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry53YygpO0cuUWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLndjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5RZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cud2MoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLnFnKHdpbmRvdyxHLmd0KCkse2lkOlVkfSl9LDUwMCksbGE9ZS5nYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51az10aGlzLmFbNl07dGhpcy5hdT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMucHU9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzddO3RoaXMuYm89dGhpcy5hWzFdO3RoaXMubD0KdGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17dGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVrOnRoaXMuJHQoYSl9LCR0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5hdTp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudm46dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnB1OnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55czp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLmR1fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC50ayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucmg9CnRoaXMuY29uZj10aGlzLmViPXRoaXMucGxheWVyPW51bGw7dGhpcy5wZD0wO3RoaXMuVmE9IiI7dGhpcy52ZD1bXTt0aGlzLndkPTA7dGhpcy50aD0hMTt0aGlzLlVlPVtdO2UuZ2IoIm5ld0FkZGVsaXZlcnkiKX1jLnJpPWI7Yi5wcm90b3R5cGU9e052OmZ1bmN0aW9uKGEpe3RoaXMucmg9YX0sQmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlZhPXRoaXMucGxheWVyLlAoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxJdjpmdW5jdGlvbihhKXt0aGlzLmViPWF9LEh2OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVmFdJiZ0aGlzLmNvbmZbdGhpcy5WYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlZhXVthXSk7cmV0dXJuIGJ9LEJjOmZ1bmN0aW9uKGEsYil7ZS51Yigid2VsdC5kZSIpJiZlLlVhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IisKZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLmh0KCkpdGhpcy5lYi5mKHRoaXMuZWIua2QsdGhpcy5lYi5DYSx0aGlzLmViLlZlLGZ1bmN0aW9uKCl7dGhpcy5CYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIubmMpO2Vsc2UgaWYodGhpcy5HcygpKXRoaXMuR3YoZnVuY3Rpb24oKXt0aGlzLkJjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLncoay4kYyx0aGlzLnBsYXllci52KCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBPKHRoaXMuZ2V0UGxheWVyKCksaCk7YiYmbC5odygpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLmdiKCJuZXdIb21hZERpc3BsYXkiKTsKUz1sPW5ldyBQKGwsdGhpcy5lYixoKTtsLkJoKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5idShhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxodDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnBkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMucGQuZ2V0VGltZSgpLHRoaXMucGQ9YSwzRTU8Yj8hMDohMTt0aGlzLnBkPWE7cmV0dXJuITF9LFp2OmZ1bmN0aW9uKCl7ZS5nYigicHJlcm9sbCIpOwplLiRlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGcoYSkpP3RoaXMuQmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX0sWXY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuJGUoInBvc3Ryb2xsIik7ZS5nYigicG9zdHJvbGwiKTt0aGlzLk52KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmxnKGMpKT90aGlzLkJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwKITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5hZCx0aGlzLnBsYXllci52KCkpKX19LGxnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSx4djpmdW5jdGlvbigpe3RoaXMucGxheWVyLlN2KHRoaXMuWXYuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sRWQ6ZnVuY3Rpb24oYSl7ZS5nYigibWlkcm9sbCIpO2UuJGUoIm1pZHJvbGwiKTtpZighdGhpcy5kaCl7dGhpcy5kaD0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5CYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLAp0aGlzLnBsYXllci5wbGF5KCksZS53KGsuYWQsdGhpcy5wbGF5ZXIudigpKSl9fSx3djpmdW5jdGlvbigpe3RoaXMucGxheWVyLk12KHRoaXMuRWQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSmUoKX0sYzpmdW5jdGlvbigpe3RoaXMuWnYoKTt0aGlzLnBsYXllci5KZSYmdGhpcy53digpO3RoaXMueHYoKX0seXY6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy52ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuV3goYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLndkPXRoaXMudmQubGVuZ3RofSxHczpmdW5jdGlvbigpe3ZhciBhPQohMTswPHRoaXMud2QmJihhPSEwKTtyZXR1cm4gYX0sR3Y6ZnVuY3Rpb24oYSl7dGhpcy50aD1hO2ZvcihhPTA7YTx0aGlzLnZkLmxlbmd0aDthKyspdGhpcy52ZFthXVsiZnVuY3Rpb24iXSh0aGlzLmN2LmJpbmQodGhpcykpfSxjdjpmdW5jdGlvbihhKXt0aGlzLndkLS07YSYmdGhpcy5VZS5wdXNoKGEpOzA+PXRoaXMud2QmJnRoaXMudGgoKX0sYnU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVWUubGVuZ3RoO2MrKyliPXRoaXMuVWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMucml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzhdO3RoaXMuU2k9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzFdO3RoaXMuZXI9dGhpcy5hWzNdO3RoaXMuc2s9dGhpcy5hWzldOwp0aGlzLkdyPXRoaXMuYVszXTt0aGlzLk9wPXRoaXMuYVs3XTt0aGlzLlFxPXRoaXMuYVsyXTt0aGlzLlFrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzVdfWMuY209YjtiLnByb3RvdHlwZT17R286ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhvOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuU2k6dGhpcy5BbihhKX0sQW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJuOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5lcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2s6dGhpcy5GcihhKX0sRnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkdyOnRoaXMuTnAoYSl9LE5wOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PcDp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXE6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5Razp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNkPWMuY218fGNkLFdkPW5ldyBjZCgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVdkLkdvKDQpfSkuY2FsbChPb3RhZWxvb3llZWJhWmVlLE9vdGFlbG9veWVlYmFaZWUpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.61.70 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.70.61.243.136.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 15 May 2019 15:00:16 GMT
Server
TornadoServer/4.5.3
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
110
inferredEvents.js
connect.facebook.net/signals/plugins/
1 KB
895 B
Script
General
Full URL
https://connect.facebook.net/signals/plugins/inferredEvents.js?v=2.8.47
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:216:face:b00c:0:3 , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
cd1c301a8e7960a1786e2a959226b0b78b56dbea284bd114265f1662d6ca280e
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
status
200
vary
Origin, Accept-Encoding
content-length
772
x-xss-protection
0
pragma
private
x-fb-debug
VWyh/kT9eUnP4B7ZTjfdprIu2LWnXq3Nkc5CoVbvfnPWestJgSVim2jtFC+7iaCigeW3ame+uOK0F1JQ3xZd+A==
date
Wed, 15 May 2019 15:00:16 GMT
x-frame-options
DENY
access-control-allow-methods
OPTIONS
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
https://connect.facebook.net
access-control-expose-headers
X-FB-Debug, X-Loader-Length
cache-control
private
access-control-allow-credentials
true
expires
Sat, 01 Jan 2000 00:00:00 GMT
/
www.facebook.com/tr/
44 B
246 B
Image
General
Full URL
https://www.facebook.com/tr/?id=413343732388253&ev=TagView&dl=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&rl=&if=false&ts=1557932416933&cd[tag_id]=146005&sw=1600&sh=1200&v=2.8.47&r=stable&ec=0&o=30&fbp=fb.1.1557932416931.322890379&it=1557932416345&coo=false&rqm=GET
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8083:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:16 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Wed, 15 May 2019 15:00:16 GMT
/
www.facebook.com/tr/ Frame 706C
0
0
Document
General
Full URL
https://www.facebook.com/tr/
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8083:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

:method
POST
:authority
www.facebook.com
:scheme
https
:path
/tr/
content-length
2422
pragma
no-cache
cache-control
no-cache
origin
https://www.golem.de
upgrade-insecure-requests
1
content-type
application/x-www-form-urlencoded
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
accept-encoding
gzip, deflate, br
cookie
fr=0SRnMRpAO3nrcGIZb..Bc3CmA...1.0.Bc3CmA.
Origin
https://www.golem.de
Upgrade-Insecure-Requests
1
Content-Type
application/x-www-form-urlencoded
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

status
200
content-type
text/plain
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains
content-length
0
server
proxygen-bolt
date
Wed, 15 May 2019 15:00:18 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1557932422932
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:23 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
__utm.gif
ssl.google-analytics.com/
35 B
122 B
Image
General
Full URL
https://ssl.google-analytics.com/__utm.gif?utmwv=5.7.2&utms=1&utmn=1337765298&utmhn=www.golem.de&utmt=event&utme=14(14500*0*70*20*40*0*1660*1660)(14518*6*71*28*47*0*1664*1664)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&utmhid=2086780775&utmr=-&utmp=%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&utmht=1557932425215&utmac=UA-518800-2&utmcc=__utma%3D21769261.1778437804.1557932412.1557932412.1557932412.1%3B%2B__utmz%3D21769261.1557932412.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=&utmu=qBQAAAAAAAAAAAAAQAQAAAgE~
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81f::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Fri, 08 Mar 2019 21:48:16 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
5850729
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
pl
insights.plista.com/
0
66 B
Image
General
Full URL
https://insights.plista.com/pl?i=5a9fe1dae45a1d155411456a&ct=14.413&rt=0.154&pt=14.567&pvr=&p=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&c=desktop&t=article&s=&tg=-1&ctg=-1&_r=1557932425218:4.7.12:20190409-113831
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN (),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
204
date
Wed, 15 May 2019 15:00:25 GMT
server
NetDNA-cache/2.2
x-cache
MISS
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.215.171 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-215-171.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

x-amz-version-id
x_soTKTeWkKa8VVAYf_8xh_Bj_jVduxx
Content-Encoding
gzip
Last-Modified
Mon, 01 Apr 2019 21:35:44 GMT
Server
AmazonS3
x-amz-request-id
7901DC7CE7480DAE
ETag
"0253570faeffb9f0f2478d761e0edfa7"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Wed, 15 May 2019 15:00:25 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5428
x-amz-id-2
xaxojAsLG4pvVxxBEr1gJ8fJIpWSSnJ5usWMmBLX51dof2Si3c9eDx5j4qv/w7kZ870hELAx36c=
adex.js
dmp.theadex.com/d/607/2256/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/607/2256/s/adex.js?ts=24471223
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.107 Oelde, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5d7896fb3a07c86f0f6f78a31c7b99e2a060a4a0212cfb5d010eeaa38ad0c93

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:26 GMT
content-encoding
gzip
last-modified
Fri, 05 Apr 2019 11:26:03 GMT
server
nginx
etag
W/"5ca73b4b-9c8f"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Wed, 15 May 2019 15:05:26 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.119 , Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn1.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 15 May 2019 15:00:28 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:13 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Tue, 21 May 2019 21:56:27 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.223.42 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-223-42.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 15 May 2019 15:00:28 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1543
content-type
text/javascript
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
673 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=86118218&src.id=Stroeer
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.29.82.21 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-82-21.eu-central-1.compute.amazonaws.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:28 GMT
Server
Apache
P3P
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Type
image/gif;charset=UTF-8
Content-Length
43
X-Application-Context
application
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Cookie set map
ih.adscale.de/ Frame 88B0
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=6abcf183db9a4daf8b3a5cffac3322b1
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=6abcf183db9a4daf8b3a5cffac3322b1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.215.171 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-215-171.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Cookie
uu=6abcf183db9a4daf8b3a5cffac3322b1
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Wed, 15 May 2019 15:00:26 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 15 May 2019 15:00:26 GMT
Content-Length
623
Connection
keep-alive
Set-Cookie
tu=4#220481566#68~~432759~432759~1#101~~432759~432759~1#38~~432759~432759~1#72~~432759~432759~1#42~~432759~432759~1#75~~432759~432759~1#60~~432759~432759~1#63~~432759~432759~1; Domain=ih.adscale.de; Expires=Fri, 14-Jun-2019 15:00:25 GMT; Path=/

Redirect headers

Server
Apache-Coyote/1.1
Location
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=6abcf183db9a4daf8b3a5cffac3322b1
Content-Length
0
Expires
Wed, 15 May 2019 15:00:25 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 15 May 2019 15:00:25 GMT
Connection
keep-alive
Set-Cookie
uu=6abcf183db9a4daf8b3a5cffac3322b1; Domain=.adscale.de; Expires=Tue, 12-May-2020 07:27:05 GMT; Path=/
p.min.js
cdn.emetriq.de/adp/profiling/0.2.1/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:a200:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Thu, 13 Dec 2018 13:56:26 GMT
content-encoding
gzip
last-modified
Thu, 13 Dec 2018 13:47:28 GMT
server
AmazonS3
age
13223043
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
hiWj6aE8JHqtrvyMwCZ_m8sYL51hXzoR
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
Q3DtaAy0yJpBLSS29n0CnmzWnebrUUp27LR6lRrYWOZm5Uh2XlVIkA==
via
1.1 170fdbe261f5e85186a08817806feba2.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Best%20of%20the%20Web%3A%20Trust-Siegel%20verteilt%20Keylogger%20-%20Golem.de&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&mbr=998cee3ca0eb4d989df876eab0380ec3&event_id=page_view&_sid=69511&_ver=0.2.1&_seg=jsonp&_=693004138754
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.223.42 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-223-42.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
65c0a0b064b75625b8a03ea647fb078de63f931416235585401f20341ba873c6

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 15 May 2019 15:00:28 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.114.144.107 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 15 May 2019 15:00:28 GMT
content-length
56
content-type
text/plain; charset=utf-8
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.202.123.193 Dublin, Ireland, ASN (),
Reverse DNS
ec2-18-202-123-193.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sun, 12 May 2019 08:50:06 GMT
Content-Encoding
gzip
Last-Modified
Sun, 12 May 2019 08:49:46 GMT
Server
akka-http/10.1.7
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame E819
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0WsbsBD_kEiaCBDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4192566177285161413
42 B
594 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4192566177285161413
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.223.42 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-223-42.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 15 May 2019 15:00:28 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Wed, 15 May 2019 15:00:28 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4192566177285161413
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame CC26
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.213.21.157 Dublin, Ireland, ASN (),
Reverse DNS
ec2-52-213-21-157.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Wed, 15 May 2019 15:00:28 GMT
Server
akka-http/10.1.7
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
594 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=998cee3ca0eb4d989df876eab0380ec3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.223.42 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-223-42.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 15 May 2019 15:00:29 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2Fnews%2Fbest-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1557932432929
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.150 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.150.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/best-of-the-web-trust-siegel-verteilt-keylogger-1905-141275.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 15 May 2019 15:00:33 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Verdicts & Comments Add Verdict or Comment

193 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| onselectstart object| onselectionchange function| queueMicrotask object| Golem object| _gcpx string| _rngnafc boolean| _rngnaf string| gafc_rubrik string| gafc_zone number| ord function| $ function| jQuery string| IVW object| _gafccsi function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| fXm_Head object| SDM_head undefined| SDM_resource string| SDM_target boolean| _golem_html5ads_enable function| _onSocialClick object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken string| grmppath object| grmpfuncs function| grmpinit function| loadScript function| grmpload undefined| gs_a undefined| gs_b undefined| gs_getDocHeight undefined| gs_amount_scrolled undefined| gs_init undefined| gs_bindScriptAndCss object| PLISTA object| NUGGjson string| n_pbt object| _m6rq object| de_meetrics function| PLISTA_JSONP_DC5498 object| PLISTA_ object| yieldlove_site_settings object| YLHH object| __core-js_shared__ object| core object| yieldlove_cmd function| pbjsYLHHChunk string| logLevel object| clrm object| BigScreen boolean| google_measure_js_timing boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id object| iAbo function| golemAcceptCookies object| stroeerCore number| google_unique_id object| google_reactive_ads_global_state object| gaGlobal object| adsbygoogle boolean| deliveringAds boolean| subDomainCheckVar object| gtssec number| gtsrand object| gtsifr object| gtsanc function| YONGZdd object| afrgh9b9Flags string| afrghdf0Rnd object| afrghd1d0tc object| google_ad_modifications object| ggeac object| google_sa_queue object| google_sl_win function| google_process_slots function| google_spfd number| google_lpabyc object| google_sv_map object| google_t12n_vars string| szmvars object| iom object| iam_data string| ioObject function| io object| ioPageArgs object| _io_config string| disableStr object| _gaq string| shareUrl object| ___gcfg number| _m6rApiLoaded boolean| afrgh809sdl boolean| afrgh809sdln string| afrghd1d0genat string| afrghd1d0sthash boolean| afrgh39bforceimp function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter boolean| afrghd99Body boolean| afrghb7eDetect object| afrgh617Mobile object| afrghd1d01 object| afrghd1d0o1 object| afrghd1d0o2 object| afrghd1d0o3 object| afrghd1d02 number| afrghd1d0d3 object| afrghd1d04 object| afrghd1d05 boolean| afrghebbij object| rmp3pi number| rmp3lphi function| SwfVideo object| exportz object| f object| _gat object| _m6rOnce number| _m6rContainerLoaded function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired object| oms_debug string| sdm_ift object| __io object| LP4 function| doLogRequest function| isNum function| testKey function| testStr function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb boolean| afrghc3cTrack string| _io_uniques_holing_params object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock object| _lntv function| lntOnLoad number| lnt_z object| OotaelooyeebaZee number| A object| mg object| ug function| videopkgInterface object| ScTag146005 object| ScTagAdditional146005 function| fbq function| _fbq function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| google object| closure_lm_419149 object| closure_lm_774263 string| hic_qos function| _h object| _adexc object| adex object| _EQLService object| _EQPScript object| ibb_lib object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

0 Cookies

2 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1(Line 1)
Message:
No Cookie

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
Strict-Transport-Security max-age=11001100; includeSubDomains; preload

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

acdn.adnxs.com
ad.yieldlab.net
ads.golem.de
ads.pubmatic.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
api.theadex.com
bbcdn-bbnaut.ibillboard.com
c1.adform.net
cdn-a.yieldlove.com
cdn.adnxs.com
cdn.adrtx.net
cdn.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cm.g.doubleclick.net
connect.facebook.net
cpx.golem.de
cpxl.golem.de
de-gmtdmp.mookie1.com
de.ioam.de
delivery.selfcampaign.com
dmp.theadex.com
dmx.districtm.io
eu-u.openx.net
farm.plista.com
fra1-ib.adnxs.com
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
insights.plista.com
irqs.ioam.de
js.adscale.de
lb100.s400.meetrics.net
lib.selfcampaign.com
match.adsrvr.org
media.plista.com
pagead2.googlesyndication.com
prg.smartadserver.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
script.ioam.de
secure.adnxs.com
securepubads.g.doubleclick.net
si.nuggad.net
ssl-golem.met.vgwort.de
ssl.1.damoh.golem.de
ssl.2.damoh.golem.de
ssl.google-analytics.com
static.plista.com
stats.g.doubleclick.net
tpc.googlesyndication.com
track.selfcampaign.com
track2.selfcampaign.com
tracking.m6r.eu
tt.onthe.io
ups.xplosion.de
uss.xplosion.de
video.golem.de
www.facebook.com
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
yieldlove-d.openx.net
104.111.214.228
104.111.215.171
104.111.215.51
104.111.215.68
13.32.223.202
13.32.223.215
13.32.223.246
13.32.223.37
136.243.12.39
136.243.2.136
136.243.61.70
136.243.94.77
138.197.186.29
138.201.125.235
138.201.126.14
148.251.131.173
148.251.69.233
151.101.121.108
161.156.66.178
172.217.22.66
173.241.240.143
173.241.240.220
18.202.123.193
185.33.223.221
185.64.189.112
185.86.138.32
193.46.63.75
2.19.33.59
2.20.169.32
216.58.210.2
23.111.11.152
2600:9000:20bb:a200:1c:8c89:a300:93a1
2606:4700:30::6818:6724
2606:4700:30::681c:13e8
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:1450:4001:806::2001
2a00:1450:4001:809::2002
2a00:1450:4001:814::200e
2a00:1450:4001:81b::2002
2a00:1450:4001:81c::2002
2a00:1450:4001:81d::2002
2a00:1450:4001:81d::200a
2a00:1450:4001:81f::2008
2a00:1450:4001:820::2006
2a00:1450:4001:821::2002
2a00:1450:400c:c08::9b
2a01:4f8:202:42d4::2
2a02:26f0:6c00:194::5f76
2a03:2880:f01c:216:face:b00c:0:3
2a03:2880:f11c:8083:face:b00c:0:25de
35.203.66.107
37.157.2.236
37.252.172.249
37.252.173.38
52.211.223.42
52.213.21.157
52.216.108.213
52.216.9.109
52.29.82.21
52.51.38.48
62.168.44.119
77.247.84.129
77.247.84.149
78.46.21.37
80.82.201.88
85.114.144.107
89.163.159.107
89.163.159.108
91.215.100.39
91.215.103.65
95.216.24.150
004b67b2a3f963c068d93b3f8e23005f48277c8b61f3d3623da9ce9e6539a456
02a8df34e2a6941840bd5caa0e5e71a7f5e773768b55c395c2f1d023042c1908
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
05ee9f210b9b1f0bc4325b1d3979d6e318f94b8d40d85a8d7629b60b2afc4574
0854d52a6ac80c7f6bb86f5e03da6005c013d002bc58da5ec2389c814c42df20
0fbf9416ccb522246292db276304ff1731ae648aa49f96c85f5a98526e85d224
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
13b219900bd84f484766a5a90357d312a6583a41591452752da8c9c12cc662b6
1478c0f24c51bfaeb59e580f11f0baa3742eecf98db25f9f60c04a42ee35f59d
14c912652278a80cde809c24f37f3e86754d820ca7c7b2c409af205de7d22d9a
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
1a774f9ff4c82d8feaa8412ed8a2520174ebda464b59bf772967a319d520e3ed
1fed4210a121c97f66f22e47237ee1355119cdc03c8e0ea6f8911428020dc1f9
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
2302ce8cf6307e809a07b5cd6ba8a546381a971b75fcc2971090154eea40c4f9
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
2abfcd790056afc481c48cd6f8e35b79b3bccf309ff6f2c0dfad0650df73d645
2b6ecd14c32260d425578d9278b8af4705c9fe9d86980a43bece283fa24e2e91
2f25e5f6f042386f0cbd93633fb42ce8351f2928108824351cb9717460214354
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
344786bb832a52e0a121dee0945e4b7a97b448ea89d7ce9fc0846841b4338110
364fba31dd048fc81ed79ea9f34caf1002ccbb4f38fd8b15666098856f20e61b
365f7bbde3749aadffbc7eef47e3b9c1d3381d247db95ba031ae44bb41afb101
3b1bb65b3d74d5c4edff923cee0515de783915579828ca06f2b532f6194b492d
3c5f4bab273c3467b080d70cae852a06e4be01fce3d4748a3c7fedbed0c9c2c6
3cf807f67ce81c36350ad1d8cf93a17311c476af13ff496280b8b2a5ef35ebf2
3d5094c1d23b5cf90a1e612d406a1c09b89533c889c287e316aa8ec1da3151f0
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3e8dadf2162e744a31d12d4935c7986dbc5c519a6829807c7582411c7972dc6d
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
46ae27a8ec9d2d449324e27f6f4827b2f33d39cfea194bf9ea31c48b8a4cf78f
46c74c2d8d78fcba820e298bc02dca4153e794d98367799240ae49340c627e47
4899bc9c6099f173d8b3df16a0b6ec888d53c5b5080aa2060dc1a0f86f83e061
4c0ee9bd341966920fbcf99fc42e339d1ca84893564ca54e9dc2d19b1e8eac2a
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
5001af7fbfe85e73272a3a91ee6a17d6ce0b22ba6cf1ed690cb87a4b634bccc0
53af729e9e4b8c8d2aae917515b562dba0d5273acc77c8775d6e05a6cddfcefd
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
55e30adb2faf80e59e4a70a75809a573ed0acd7b6fb703bde722bd3ddf56584d
585cc11b4d20958229b3e7f944f3c7d616e947fdf93777fdee3bae2b3da47207
58d5d69efb99ba86b86e44a4753304d14f0ebcda68e3b9b31faa68d85d2a9811
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5a7eb85e3b035673ff1e9f66977c697902a8be8235e3ebbd233b8d2636cfaed1
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed
5d6c44d5980f3c680724df4abe386d27d13c519f4ffa1262dc6e649b32f6a5d8
600a0718bc411395294d3af96651470ec26c15c3f0a6ca3b579a523c9098b4ce
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953
653ecfa4fbb8a0a5085d4eb14fc668c8cd30ff0b51616f7a8032c88d7468ea93
65c0a0b064b75625b8a03ea647fb078de63f931416235585401f20341ba873c6
66f800ffe97e28c9141b4b3bfd12f5cc5d3ab3aeb268c91603096130b4c3a843
6a1cf4449f7e36f0be6c7109311442b030b10fc4cdaafa0d2f94b11423c8aacc
6a842ea462daca2a0b5a0f5f25bcfc8e0059ac811ca6c6a1bc54e4d9119621c3
71561a3bca82f8abb1c48231b9d1a6500aa76c5f3eb838f2ac1dc0c81c5811ae
72ce44d1321e5caeec893cabdf662745ce2d8af68b65665b6e62e5f7bbcd5e0f
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76ceb9b46c9787fba45d74064ac8e7ea819b8cfe3060d11a0c9cea3706f4575f
7a8571861150568201139b95e61e158985c9184cb70f87f030f3f8f9f73d1b90
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8b57f4564ee7f6405b8373fc3f700323c895347812eef8a863e465302384b804
9070e35234f0465cea9be77a4a32290bc99295ecd060fc00b4acff726b2020ff
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
93d39da3773a26f38a235454f91d1d2a57a0d9d066c72f9a41452651b08e539e
95061a8820dde009f18dd271c6bdb828979a2aac2a79f931b066bc88df962fba
96bff9a63428fcafaa40226d7ccf7b90ab5776979db144a62bdef6a7a77d5eec
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6
9832c7692ea71e529df162815044411cbe911b4dad62ce20a6a016e0e6a5abba
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d
9b989a4ec9504073a81fda90e33853f122408f4ccfdf93571dd7e80f5d513a7a
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9e08d9b8d1eb5cfb13e10bc6afb3a6f3a40f6ac1f65c6ecd076dc66b7edafb6a
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a07f832083383414f0f5fc8f77c6ba5a01396526ac55f3179060aa25bb9b8297
a1143eb79f86618f8a72788f8f9f8e5884797dbd12e6d0a7c212f46c1dd1e525
a161cba4b2b8a90e2ca19e935256925fa3920b6ed129ec1568fccbd1a290b1b1
a5bca980db62cd62b8af6d7e13a8fca10bcf3275d804a266bac4cd2907e206d2
a5d7896fb3a07c86f0f6f78a31c7b99e2a060a4a0212cfb5d010eeaa38ad0c93
a7aa1f3c4873cf956867046e3323f46b520c34096610459c6d946bc80a29f15d
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b71c20271d9c80d1a71aa0ab9935281c4fa8ac404533f1a0747d7fb03fc68e79
be9bb0e47a75517ad7436ee0b79ebc78f91da542f35779c49634364e8c081dcf
c310ae4c86fb59bf152d1d49816b8fe9d9c9122ce81d3bb99d4c9e3d7ec152cc
ca18ecebfef618d82aa834ac387bf9ad0ef34232d4eb3618005b4e3542af81b9
cd1c301a8e7960a1786e2a959226b0b78b56dbea284bd114265f1662d6ca280e
cd8cab6134789f4be73101396dea39afb45e9337fc310e1bd11d5ac6cd325ec8
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d3f0b18ecfed35542118ed5eb92d5ac4d4ee5c5debd378af0344e43b737ab035
d5d7e39e86102bcd40f61e472248856e51ee4f6f614fc4b71a04b435428e7357
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d645956646bc0e6e1a33190fce79233b95079081e906891293f343a7c98492bc
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
e308c5b563f4ca46d35d9e3296a707ed62758a423d88a6a7d244209e61764e6e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e5d1abb983fb4642a5c12b36921ee88e3444084d8d34265be58c85f13c22dc45
e6f7ca4fc92e11a42ddbb3a9d369ce4d42fb95faf2567f485a7769e51825706d
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e89fc0906dd590bbf06858059577b07695e00936b2a6fd5d64fc247c542a1c09
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f93b78838680ebc6e776cda71019b65bd1e752224d2df0940d7361544bfcbb6e
fa59b1ed1b011e084474ad818b5f6986d84fc678e2f37fee9330eb52d86860b3
ff8d0cd9b6e1af7e78d6e1c78d2e71bd6c887ec2f83277305d69f8252f6c26d6