URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Submission Tags: phishing malicious Search All
Submission: On September 24 via api from US

Summary

This website contacted 79 IPs in 7 countries across 59 domains to perform 248 HTTP transactions. The main IP is 178.19.72.10, located in Germany and belongs to HGCOMP-ASN, DE. The main domain is www.giga.de.
TLS certificate: Issued by RapidSSL RSA CA 2018 on July 18th 2018. Valid for: 2 years.
This is the only time www.giga.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
14 178.19.72.10 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.103.64 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
3 178.19.70.100 29551 (HGCOMP-ASN)
12 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
3 188.40.16.106 24940 (HETZNER-AS)
1 2 161.156.66.178 36351 (SOFTLAYER)
1 2 2a03:2880:f12... 32934 (FACEBOOK)
16 2a00:1450:400... 15169 (GOOGLE)
4 99.84.157.237 16509 (AMAZON-02)
1 9 107.178.241.34 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.100.40 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
3 2606:4700:20:... 13335 (CLOUDFLAR...)
3 178.19.72.20 29551 (HGCOMP-ASN)
4 10 104.109.82.87 20940 (AKAMAI-ASN1)
1 13.32.223.253 16509 (AMAZON-02)
3 2.18.233.67 16625 (AKAMAI-AS)
1 2 80.82.201.88 48173 (UNBELIEVA...)
1 35.156.29.62 16509 (AMAZON-02)
1 2600:9000:20b... 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 15 172.217.16.162 15169 (GOOGLE)
2 8 2.18.234.72 16625 (AKAMAI-AS)
5 136.243.2.136 24940 (HETZNER-AS)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 52.28.148.3 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
14 151.101.14.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.216.48 16509 (AMAZON-02)
2 52.219.72.199 16509 (AMAZON-02)
1 5 2.19.43.224 20940 (AKAMAI-ASN1)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
2 4 185.33.223.221 29990 (ASN-APPNEXUS)
1 3 34.95.120.147 15169 (GOOGLE)
3 99.84.151.92 16509 (AMAZON-02)
2 151.101.13.194 54113 (FASTLY)
5 13 151.101.114.2 54113 (FASTLY)
1 2 184.30.220.71 20940 (AKAMAI-ASN1)
7 151.101.14.49 54113 (FASTLY)
2 2 18.196.229.216 16509 (AMAZON-02)
1 69.173.144.165 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
3 3 216.58.205.226 15169 (GOOGLE)
1 1 52.49.153.216 16509 (AMAZON-02)
1 1 52.43.231.55 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
3 3 18.196.234.219 16509 (AMAZON-02)
3 3 34.239.65.48 14618 (AMAZON-AES)
7 185.22.221.117 60955 (WAVECON)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 62.168.44.125 5588 (GTSCE GTS...)
3 5.9.113.38 24940 (HETZNER-AS)
2 148.251.84.39 24940 (HETZNER-AS)
2 82.149.242.40 29551 (HGCOMP-ASN)
1 2 172.217.21.198 15169 (GOOGLE)
4 188.40.110.202 24940 (HETZNER-AS)
4 2.21.37.179 20940 (AKAMAI-ASN1)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2.18.232.7 16625 (AKAMAI-AS)
2 69.16.175.42 20446 (HIGHWINDS3)
2 54.235.243.56 14618 (AMAZON-AES)
2 18.196.191.159 16509 (AMAZON-02)
1 2.16.122.151 20940 (AKAMAI-ASN1)
1 144.76.115.247 24940 (HETZNER-AS)
3 151.101.114.49 54113 (FASTLY)
1 2a03:2880:f02... 32934 (FACEBOOK)
1 89.163.159.103 24961 (MYLOC-AS)
1 62.168.44.119 5588 (GTSCE GTS...)
4 63.32.86.220 16509 (AMAZON-02)
1 52.28.35.163 16509 (AMAZON-02)
1 2600:9000:20b... 16509 (AMAZON-02)
1 89.163.159.120 24961 (MYLOC-AS)
1 54.154.35.6 16509 (AMAZON-02)
1 1 89.163.159.100 24961 (MYLOC-AS)
1 151.101.13.108 54113 (FASTLY)
1 108.128.71.27 16509 (AMAZON-02)
248 79
Apex Domain
Subdomains
Transfer
38 taboola.com
cdn.taboola.com
trc.taboola.com
15.taboola.com
match.taboola.com
cds.taboola.com
vidstat.taboola.com
imprammp.taboola.com
convammp.taboola.com
569 KB
26 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.3.damoh.giga.de
ssl.1.damoh.giga.de
457 KB
23 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
ad.doubleclick.net
190 KB
16 google-analytics.com
www.google-analytics.com
46 KB
12 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
76 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
188 KB
11 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
7 KB
9 adscale.de
ih.adscale.de
native.adscale.de
js.adscale.de
14 KB
8 googletagservices.com
www.googletagservices.com
200 KB
7 oadts.com
media.oadts.com
122 KB
7 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
197 KB
6 de.com
s79.research.de.com
dc546.s79.research.de.com
3 KB
6 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
26 KB
5 adnxs.com
ib.adnxs.com
acdn.adnxs.com
5 KB
5 scorecardresearch.com
sb.scorecardresearch.com
3 KB
5 meetrics.net
lb100.s400.meetrics.net
1 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
14 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 cliipa.com
static.cliipa.com
bis.cliipa.com
server.cliipa.com
inventory.cliipa.com Failed
130 KB
4 ibillboard.com
video-adserver.ibillboard.com
tracker-adserver.ibillboard.com
bbcdn-bbnaut.ibillboard.com
3 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
84 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 smadex.com
cm.smadex.com
1 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
61 KB
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
3 mxcdn.net
s400.mxcdn.net
s79.mxcdn.net
140 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
590 B
2 consensu.org
cmp.teads.mgr.consensu.org
2 gamona.de
media.gamona.de
5 KB
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
119 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 nuggad.net
si.nuggad.net
adscale.nuggad.net
2 KB
2 google.com
adservice.google.com
apis.google.com
17 KB
2 google.de
adservice.google.de
346 B
2 facebook.com
www.facebook.com
625 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
673 B
1 atdmt.com
cx.atdmt.com
405 B
1 yieldlab.net
ad.yieldlab.net
495 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
344 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
450 B
1 adsrvr.org
match.adsrvr.org
500 B
1 powerlinks.com
px.powerlinks.com
402 B
1 rubiconproject.com
pixel.rubiconproject.com
239 B
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 giga-video.de
files.giga-video.de
30 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
436 B
1 yieldlove.com
cdn-a.yieldlove.com
89 KB
1 gstatic.com
www.gstatic.com
143 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
248 59
Domain Requested by
16 www.google-analytics.com www.giga.de
www.google-analytics.com
15 securepubads.g.doubleclick.net 1 redirects www.googletagservices.com
securepubads.g.doubleclick.net
www.giga.de
14 www.giga.de www.giga.de
13 trc.taboola.com 5 redirects cdn.taboola.com
www.giga.de
10 tracking.m6r.eu 4 redirects www.giga.de
media.oadts.com
confiant-integrations.global.ssl.fastly.net
8 vidstat.taboola.com confiant-integrations.global.ssl.fastly.net
vidstat.taboola.com
8 www.googletagservices.com js.stroeermediabrands.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
static.cliipa.com
7 media.oadts.com www.giga.de
media.oadts.com
6 t.teads.tv www.giga.de
6 cdn.taboola.com www.giga.de
cdn.taboola.com
6 videos.giga.de www.giga.de
videos.giga.de
text
6 d.nativendo.de 1 redirects www.giga.de
c.nativendo.de
confiant-integrations.global.ssl.fastly.net
5 match.taboola.com www.giga.de
5 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
5 lb100.s400.meetrics.net www.giga.de
5 ih.adscale.de 2 redirects js.adscale.de
www.giga.de
4 a.teads.tv www.giga.de
confiant-integrations.global.ssl.fastly.net
a.teads.tv
4 dc546.s79.research.de.com www.giga.de
4 ib.adnxs.com 2 redirects cdn-a.yieldlove.com
www.giga.de
4 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
4 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
3 convammp.taboola.com
3 ssl.3.damoh.giga.de text
3 cm.smadex.com 3 redirects
3 x.bidswitch.net 3 redirects
3 cm.g.doubleclick.net 3 redirects
3 t.nativendo.de confiant-integrations.global.ssl.fastly.net
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 tpc.googlesyndication.com securepubads.g.doubleclick.net
3 go.giga-abs.de www.giga.de
3 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 de.ioam.de 2 redirects www.giga.de
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de confiant-integrations.global.ssl.fastly.net
cdn.emetriq.de
2 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 static.cliipa.com securepubads.g.doubleclick.net
static.cliipa.com
2 cmp.teads.mgr.consensu.org confiant-integrations.global.ssl.fastly.net
2 ad.doubleclick.net 1 redirects www.giga.de
2 s79.mxcdn.net s79.research.de.com
confiant-integrations.global.ssl.fastly.net
2 media.gamona.de www.giga.de
media.gamona.de
2 s79.research.de.com securepubads.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
2 video-adserver.ibillboard.com media.oadts.com
2 rtb.mfadsrvr.com 2 redirects
2 js.adscale.de confiant-integrations.global.ssl.fastly.net
2 native.adscale.de 1 redirects www.giga.de
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
2 www.facebook.com 1 redirects www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
2 static.giga.de www.giga.de
1 adstax-match.adrtx.net confiant-integrations.global.ssl.fastly.net
1 acdn.adnxs.com cdn-a.yieldlove.com
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.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 confiant-integrations.global.ssl.fastly.net
1 dmp.theadex.com confiant-integrations.global.ssl.fastly.net
1 cx.atdmt.com
1 ssl.1.damoh.giga.de text
1 adscale.nuggad.net 1 redirects
1 ad.yieldlab.net www.giga.de
1 sync.teads.tv confiant-integrations.global.ssl.fastly.net
1 server.cliipa.com static.cliipa.com
1 bis.cliipa.com static.cliipa.com
1 tracker-adserver.ibillboard.com www.giga.de
1 imprammp.taboola.com confiant-integrations.global.ssl.fastly.net
1 cdn.stroeerdigitalmedia.de www.giga.de
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 match.adsrvr.org 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com www.giga.de
1 15.taboola.com confiant-integrations.global.ssl.fastly.net
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 cdn.m6r.eu js.stroeermediabrands.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 files.giga-video.de www.giga.de
1 ajax.googleapis.com www.giga.de
1 apis.google.com www.giga.de
1 d.agkn.com js.agkn.com
1 dkuim.de www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.de
1 si.nuggad.net js.stroeermediabrands.de
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 adservice.google.com pagead2.googlesyndication.com
1 irqs.ioam.de script.ioam.de
1 www.gstatic.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
0 inventory.cliipa.com Failed www.giga.de
248 102
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-09-23 -
2020-09-10
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.google.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-08-24 -
2019-10-19
2 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
c.amazon-adsystem.com
Amazon
2018-12-18 -
2019-11-21
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-05-06 -
2019-11-12
6 months crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year 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
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.googleapis.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
*.apis.google.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-12-12 -
2019-12-10
a year crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-11-08 -
2019-11-06
a year crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-03 -
2019-11-19
7 months crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
3 months crt.sh
*.gamona.de
RapidSSL RSA CA 2018
2019-02-18 -
2021-05-19
2 years crt.sh
*.doubleclick.net
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
teads.tv
Let's Encrypt Authority X3
2019-08-22 -
2019-11-20
3 months crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2019-09-23 -
2019-12-22
3 months crt.sh
*.cliipa.com
COMODO RSA Domain Validation Secure Server CA
2018-11-19 -
2019-11-19
a year crt.sh
api.yieldlove-ad-serving.net
Let's Encrypt Authority X3
2019-08-15 -
2019-11-13
3 months crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.atlassolutions.com
DigiCert SHA2 High Assurance Server CA
2019-07-11 -
2019-10-09
3 months crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
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
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year crt.sh

This page contains 29 frames:

Primary Page: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Frame ID: 68BD877A15BEB62139CFB4048DCF04E3
Requests: 162 HTTP requests in this frame

Frame: https://videos.giga.de/embed/176875?autoplay=0
Frame ID: 19CFCD52D5673E22581C1690E631238F
Requests: 19 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/html/r20190918/r20190131/zrt_lookup.html
Frame ID: 90B090DDFAA37061D5CC2F2F35C06E03
Requests: 1 HTTP requests in this frame

Frame: https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Frame ID: 865D198ACA084844C8C390CF415E3843
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569317719&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1569317719484&bpp=11&bdt=138&fdt=116&idt=116&shv=r20190918&cbv=r20190131&saldr=aa&abxe=1&correlator=7574961517634&frm=20&pv=2&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&ga_fc=0&iag=0&icsg=816317432&dssz=56&mdo=0&mso=0&u_tz=120&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=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064505&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.nirjfwr1wfuz&fsb=1&xpc=IGTMaD6k6b&p=https%3A//www.giga.de&dtd=128
Frame ID: F2F9892EE0ABF4C39752D9A506C1DB6B
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569317719&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569317719563&bpp=3&bdt=217&fdt=88&idt=88&shv=r20190918&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7574961517634&frm=20&pv=1&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&ga_fc=0&iag=0&icsg=2251812874764216&dssz=61&mdo=0&mso=0&u_tz=120&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=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064505&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.4ybpw68kj92x&fsb=1&dtd=93
Frame ID: DAED3DC3A55415B9CCF7824C419A3ECD
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=921303493&gdpr=&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 963ED2B261C84D5A61CB37605074AB72
Requests: 1 HTTP requests in this frame

Frame: https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Frame ID: F7AA737E83BD8AE2FBDF40E4E492B774
Requests: 1 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=79647db2-724f-48ea-8e93-1b277d07c21c
Frame ID: 1C7681485F9D3C7C8AA2EB67FAE80E70
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv-yOcDuZTdRfnnWzGwivo33swm_-uNY5K_WsQNYDX2SVJGlZGmSuG5MLaOtsrmlAtvt4de8u6s6iIiGsEdtdGCDWF4B-6im7vnvEPU6Ai_JZ0keGXHmpqLna66-CdsGe5D0MC-hA5WXXSLw9Fiw-hIDq3iAPFvIQChD8Swkh6c5gLXyO_YNaTfwXoyhDVTdI502vssRJGeGEe12vC6_ysAwSgPO1dHA-A-t1lxA3_MwOMT1UUHOvRZi5JjsoWYBwQZl0RlbWfw0OQ4mLW7JsC7dQ&sig=Cg0ArKJSzBlbr1BWFanNEAE&urlfix=1&adurl=
Frame ID: 012023F824592832DB5480A88FA32602
Requests: 14 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Frame ID: D4BB12573020DD518CAD48A6531CF6B8
Requests: 1 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=1AE97D881841987170235317255&cicmp=1657475&cijs=1&dast=V7TRoCFgPOKGtV09RuTATOKGtV09RuTAUAAAAGBvQHHLFgMXcj4nAxHC2Ww91itlwMVsvRbDcZbqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQxkCqOTQX6C5RAWIRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQJgYaAZalOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PZBc7SamjWGx3C03Nsto4posZoOVbTFymIbLkW24vTkKSNfokpCHvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhxjYzD0Wjh1g1GnrVoMDGsJS7bcC3zrGy72chm8UxMa9HrYzoNN7PhyLdFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssm-udhPTxrBY7pYbm2U0cU0Ws8HKthg5TMPlyDbcd1wj43A0Wrh1g5FnLRpMDGuJyzZcyzwr2242slk8E9Na9PqYTsPNbDjy7Rur2XKz2O0Wy31jNVtuFrvdYrnv0Bm-q8_ZqLxpFR6VLfNZib0yp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjcO4GI1MHpdvY1uYRibDYrHZbFbDmcM5mThWE4tYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&tst=1&docw=0
Frame ID: AE35103F373E028F590670FB9EB68643
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsutOhOO_SYpLDmwx9NIeKSX8euhdD0k6E9YcXS2ZJixGySfJhxUSVaWN8jpj9dFZ8KgP4UzcTufcosXPRwZlaty7FrH8kfP9KdATfIUcrhBWZnTaDyl1wWlONiQjpc0_XroAbM7xhBUfuLTE3Ki1DksLMnX4J3_wipn8EzmRB7O_fykbmB98vrbNb7SfJEEoBGSXnWoYJMX9bMn2NVN1qzS38T1Sn3V9CF8Z0NgPw3V7xtnLPn7tEgfYthqj6IuMOziC3GP9F94rWnHipLcHg2vsjzyRAC73w3oroCkHgDr&sig=Cg0ArKJSzPMcMIjZclzDEAE&urlfix=1&adurl=
Frame ID: 3CABAC25B5343F7B30FFDE7C2D4FFB8A
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssbKftPp18uop-TDrnnCorikDh7QOXjBZ8JbPNvzNNsWOiH8Kuvv4TII9-XSfv9YERt66p1P7SIrnesWIG2AOpHA7U8GzAalVbDYx2sx7IEh2kAyQP0cuVT6D5dyyF5NjwoXb7AVOShr2uAMavFgysIEPjQaXikikZC92ylAAx1R5WsD9CsxZlZv9XAjApHuN_HbCZKjh3TNXuZKurB_aQTVsqCmN08cV-zE0IcbM8lZU_l5x8Vv4FKS7S3TVztHKxkR_IS4qY4naUlsUa9GkMgOtmk67ejHHfP95aHy5um&sig=Cg0ArKJSzHfDWQ9uPWI-EAE&urlfix=1&adurl=
Frame ID: 04E6568161C1FAA5D012EF889E7BE099
Requests: 2 HTTP requests in this frame

Frame: https://media.gamona.de/assets/dragon_quest_xi/brand-booster/index.html
Frame ID: FF79210F13AB7EB263ED800517FFD328
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: 5814732106C2872ED37DCB0A4E1FDE98
Requests: 1 HTTP requests in this frame

Frame: https://cmp.teads.mgr.consensu.org/index.html
Frame ID: 3328B640C29FD9745F1109B88D17B749
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvsK2cPdD9DYhZTfrl8vxKzLzVSRHfETghXGt4XFk6g7l1XvQr_aDO8LlK0AC--UJ9C6_3WsU4tOSD_mq3Hd9jlxFAPjaD6rgKiNwOq-f_MRWSGoX2CAvfCpJzqL_TON7n1DTnBJafaynqIHW2jLK2rN8l2rgOmVS2alScBYteEc5el1iEZus96DuXEGaIE9YtDncxTxQkIg8FOJ1S2jQ7oQL4bwjINcJoMa48-lVDYnZRqOBgl_KDagIVWXsEtlGERGUxZuHkGX8mkeNM3MnKhIyq00j1J6N0T7Dex&sig=Cg0ArKJSzHiA5wexGWDiEAE&urlfix=1&adurl=
Frame ID: 0BD0C5CD6047CE0D0EC353FF37A1C92C
Requests: 13 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=73584&userId=0f9d255f-df62-40c7-87d7-8c1c6406f3e9&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569317720987
Frame ID: 9FF04571B529ED42C6961FF66EBAB85B
Requests: 1 HTTP requests in this frame

Frame: https://www.googletagservices.com/tag/js/gpt.js
Frame ID: B85D8A1817B9BAAFFBBE99DFB9806175
Requests: 7 HTTP requests in this frame

Frame: https://ih.adscale.de/map?format=display&ssl=1
Frame ID: 5FD9C70914A04944C807DE65A020C082
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/7f20f7c4d5cf4e4682eee5e5e59f06b7/ts/1569317722053/v/2/hid/407/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Frame ID: 7A393502ECBDD7F47E17A65DBC518076
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=2
Frame ID: 0B0EA142C621F9C6F6B46CEA6A5F9CF4
Requests: 1 HTTP requests in this frame

Frame: data://truncated
Frame ID: 3AA6E4ED94C5468D676EB978859C7A70
Requests: 1 HTTP requests in this frame

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

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 93CC139AD285F6C6DBB14B14C94BDAF5
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: 1764572D5DB6F43BE799D71218B80E38
Requests: 1 HTTP requests in this frame

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

Screenshot


Detected technologies

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

Overall confidence: 100%
Detected patterns
  • script /google-analytics\.com\/(?:ga|urchin|analytics)\.js/i

Overall confidence: 100%
Detected patterns
  • html /<iframe[^>]* (?:id="comscore"|scr=[^>]+comscore)|\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i
  • script /\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i

Page Statistics

248
Requests

98 %
HTTPS

21 %
IPv6

59
Domains

102
Subdomains

79
IPs

7
Countries

3014 kB
Transfer

9387 kB
Size

20
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 13
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 19
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000ff66e3038df9535d89e357&ep=1599171302&vr=415&id=sxnjyl&i3=000ff66e3038df9535d89e357%3A1596620119425%3A1569317719425%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1569317719425&n1=3&dntt=0&lt=1569317719427&ev=&cs=kmzu01&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000ff66e3038df9535d89e357&ep=1599171302&vr=415&id=sxnjyl&i3=000ff66e3038df9535d89e357%3A1596620119425%3A1569317719425%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1569317719425&n1=3&dntt=0&lt=1569317719427&ev=&cs=kmzu01&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 33
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 38
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 52
  • https://ih.adscale.de/tpui?tpid=19&tpuid=aadaa111-6bd1-47ec-980c-70facfa8da08&cburl=https%3A%2F%2Fd.nativendo.de%2Fcds%2Fdmp%2Fuuid%3Fuser_id%3D__ADSCALE_USER_ID__%26dsp_id%3D1 HTTP 302
  • https://ih.adscale.de/tpui?tpid=19&tpuid=aadaa111-6bd1-47ec-980c-70facfa8da08&cburl=https%3A%2F%2Fd.nativendo.de%2Fcds%2Fdmp%2Fuuid%3Fuser_id%3D__ADSCALE_USER_ID__%26dsp_id%3D1&nut&uu=fa3e41f748b84ae98c59607e004f6e19 HTTP 307
  • https://d.nativendo.de/cds/dmp/uuid?user_id=fa3e41f748b84ae98c59607e004f6e19&dsp_id=1 HTTP 307
  • https://d.nativendo.de/cds/dmp/uuid/check/c3b879eb-3b07-414b-ade9-f5670aed5e67/
Request Chain 82
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Request Chain 96
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1569317719950&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1569317719950&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Request Chain 99
  • https://native.adscale.de/native HTTP 307
  • https://native.adscale.de/native?uu=b1f3ebd68ba744b185fe0c296191b0de
Request Chain 114
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=79647db2-724f-48ea-8e93-1b277d07c21c
Request Chain 116
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D HTTP 302
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=HlTR7n3JFhIKzXo19ZA7oTBX38q_DbT3S3-YQPXoV0A%3D
Request Chain 117
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID HTTP 302
  • https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=8530186435669027651 HTTP 302
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=8530186435669027651&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D8530186435669027651
Request Chain 118
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc HTTP 302
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEFW1Ucrf84ZzSic6cFk_Fqk&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFW1Ucrf84ZzSic6cFk_Fqk&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3DCAESEFW1Ucrf84ZzSic6cFk_Fqk%26google_cver%3D1
Request Chain 119
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID HTTP 302
  • https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=8530186435669027651
Request Chain 120
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=f76dcd2a-d6ac-4c59-96df-20ab243f5eaf HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=f76dcd2a-d6ac-4c59-96df-20ab243f5eaf&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Df76dcd2a-d6ac-4c59-96df-20ab243f5eaf
Request Chain 121
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=09ca3ed7-d059-4eeb-ac62-ca79da567b69 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=09ca3ed7-d059-4eeb-ac62-ca79da567b69&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D09ca3ed7-d059-4eeb-ac62-ca79da567b69
Request Chain 124
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://cm.smadex.com/pixel?sm_did=bds&bds_ssp_id=taboola&bds_param=d95cd948-bc58-431c-b957-8488855ee0c2 HTTP 302
  • https://cm.smadex.com/pixel?sm_did=bds&bds_ssp_id=taboola&bds_param=d95cd948-bc58-431c-b957-8488855ee0c2&sm_tc= HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=smadex_2&google_hm=T2w0dlBZd01TNnFsWUFVSERwS1hNUT09&sm_p=dc&sm_r=bds HTTP 302
  • https://cm.smadex.com/sync?sm_p=dc&sm_r=bds HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=340&user_id=3a5e2f3d-8c0c-4baa-a560-05070e929731&expires=10 HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=d95cd948-bc58-431c-b957-8488855ee0c2 HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=d95cd948-bc58-431c-b957-8488855ee0c2&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Dd95cd948-bc58-431c-b957-8488855ee0c2
Request Chain 134
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsssYentSJebTjCFTP8Hcc7P2ebzEAMOfqZ9jq1RGMLGlIlErcjFPt9CwIujxfyjQQGEj6a9F8J1ZEd_XsOZRGI2s0jQdJOk4ME7DcbsjemJAIL1GVWV198D6xf76In1xGn4MInqCaT_RzkP7JohLOEVO-MjGtoTwzBsHQrVKED4bdWH6J7JBbbjUZTUDz0toDu-UsCz5XHtRe67p9FtBIMfukwbNmnSQPEmtvG9vVx9KthPKU4p2_Y87PhzouiaQK2K5qly8AaJL2cocKBgow&sig=Cg0ArKJSzIQ9a99gil52EAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 161
  • https://ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/B23195172.255206606;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua= HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/B23195172.255206606;dc_pre=CKibooqU6eQCFUE74AodCxkMqg;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
Request Chain 196
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=445b0eb73f158de8dbed42dc56d2b33c
Request Chain 197
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=RFsOtz8Vjejb7ULcVtKzPA HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 198
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=445b0eb73f158de8dbed42dc56d2b33c
Request Chain 214
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F7f20f7c4d5cf4e4682eee5e5e59f06b7%2Fts%2F1569317722053%2Fv%2F2%2Fhid%2F407%2Fssl%2F1%2Fws%2Fhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%2Fnvars%2FNUGGVARS HTTP 302
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/7f20f7c4d5cf4e4682eee5e5e59f06b7/ts/1569317722053/v/2/hid/407/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Request Chain 227
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent HTTP 302
  • https://cx.atdmt.com/?c=3296578555807784287&f=AYxZlHxKtYnd0RcZbsvDYbjRlZ7eUTf4seC7foWzmRrSA5nWXKWrcPqgf8k6iyxvUwqwY7xDbwIwGuuOx_9elMZ8&id=1773162896260346&l=3&v=0
Request Chain 243
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESB-WsRkBsJkESUkWsfABifABSfABSfABifABifABfrr&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=4204791044702082191
Request Chain 245
  • 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

248 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
146 KB
53 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f0931b243e8edbd99694b657e6f050737319039cb96b165b290623f52422c5b0

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
navigate
sec-fetch-user
?1
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1

Response headers

status
200
server
nginx
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
date
Tue, 24 Sep 2019 09:35:19 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
15 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
last-modified
Tue, 24 Sep 2019 08:27:07 GMT
server
nginx
accept-language
bytes
etag
"5d89d35b-3c78"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15480
expires
Wed, 23 Sep 2020 09:35:19 GMT
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
last-modified
Tue, 24 Sep 2019 08:27:07 GMT
server
nginx
accept-language
bytes
etag
"5d89d35b-3da8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15784
expires
Wed, 23 Sep 2020 09:35:19 GMT
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
16 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
last-modified
Tue, 24 Sep 2019 08:27:07 GMT
server
nginx
accept-language
bytes
etag
"5d89d35b-3e24"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15908
expires
Wed, 23 Sep 2020 09:35:19 GMT
lux.js
cdn.speedcurve.com/js/
19 KB
7 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=131387135
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.217 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
20694
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19183-FRA
access-control-allow-origin
*
last-modified
Tue, 24 Sep 2019 03:50:25 GMT
server
Apache
x-timer
S1569317719.394631,VS0,VE0
date
Tue, 24 Sep 2019 09:35:19 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Wed, 25 Sep 2019 03:50:25 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
1937
pre-c98fb5a50e.js
www.giga.de/static-local/dist/assets/js/
59 KB
19 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b30318c09de51d9770ea476cc9ed29d076a7bb52e8c97441f30968070e6d70a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 20 Sep 2019 10:03:18 GMT
content-encoding
gzip
x-original-content-length
60608
server
nginx
status
200
etag
W/"5d84a38d-ecc0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19332
expires
Sat, 19 Sep 2020 10:03:18 GMT
main-desktop-21d69eb55d.css
www.giga.de/static-local/dist/assets/css/
356 KB
49 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-21d69eb55d.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
27c74238cbd981ca153723bbd76adbc8dba81e9e6703f6b7312d36d2dd3951c3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 20 Sep 2019 10:03:18 GMT
content-encoding
gzip
x-original-content-length
364698
server
nginx
status
200
etag
W/"5d84a38c-5909a"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
50144
expires
Sat, 19 Sep 2020 10:03:18 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 000f
Resource Hash
fb829884f8bc67aefe0869ffdba718c066b727623f1fb2ef2b77e12b65fc9621

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Encoding
gzip
Last-Modified
Tue, 24 Sep 2019 09:35:19 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 000f
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Tue, 24 Sep 2019 11:35:19 GMT
metaTag.min.641b533ee5b9646697c716b44e495547.js
js.stroeermediabrands.de/
258 KB
62 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.178 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
ca3bb49ea990edfb106762228375c35b7070f2eb360aae2f442939a6106252c1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Mon, 23 Sep 2019 12:24:02 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Wed, 23 Sep 2020 09:35:19 GMT
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
796 B
1 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 19 Sep 2019 14:38:47 GMT
x-content-type-options
nosniff
age
413791
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Thu, 19 Sep 2019 14:38:47 GMT
server
nginx/1.10.3
filer-attr
W1s0MCw0MF0sInNodXR0bGUtdjEiLFsiRlJBLTEiXSxbIkZSQi0xIl1d
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 19 Oct 2019 14:38:47 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
97 KB
35 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
fab9d391acf9bff49f9e7ff91604c13f64507c878d911f662402eecc4345da35
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
35526
x-xss-protection
0
server
cafe
etag
16959286864328261770
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Tue, 24 Sep 2019 09:35:19 GMT
1.gif
www.gstatic.com/psa/static/
53 B
143 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 18 Sep 2019 05:08:09 GMT
x-content-type-options
nosniff
last-modified
Thu, 21 Apr 2016 03:17:22 GMT
server
sffe
age
534430
content-type
image/gif
status
200
cache-control
public, max-age=31536000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
53
x-xss-protection
0
expires
Thu, 17 Sep 2020 05:08:09 GMT
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
6 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:05:35 GMT
x-content-type-options
nosniff
age
1315784
filer-source
8fa6d82067b578ca8e6bb273bed34f9d123e3ee778a1db1a4f9ea350b5447154
x-cache
HIT
status
200
accept-language
bytes
content-length
5657
x-xss-protection
1; mode=block
last-modified
Mon, 09 Sep 2019 04:05:35 GMT
server
nginx/1.10.3
filer-attr
W1syMzUsMTI5XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 09 Oct 2019 04:05:35 GMT
trackcp.js
gocp.stroeermediabrands.de/
27 KB
10 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
85838fca0e7ee704142710df49c3ce62ed2d4dc4b52c3b644ca816608ea08099

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Encoding
gzip
Last-Modified
Thu, 19 Sep 2019 14:14:26 GMT
ETag
"5d838d42-6df1"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Expires
Wed, 25 Sep 2019 09:35:19 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-econa.met.vgwort.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
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.19 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Tue, 24 Sep 2019 09:35:18 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Tue, 24 Sep 2019 09:35:18 GMT
Last-Modified
Tue, 24 Sep 2019 09:35:18 GMT
Server
s2.50.19
Access-Control-Allow-Origin
*
Transfer-Encoding
chunked
Content-Type
text/html
Location
/blank.gif
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
tr
www.facebook.com/
44 B
322 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=PageView&noscript=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f12d:83: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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 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
Tue, 24 Sep 2019 09:35:19 GMT
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
3106
date
Tue, 24 Sep 2019 08:43:33 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
17803
expires
Tue, 24 Sep 2019 10:43:33 GMT
apstag.js
c.amazon-adsystem.com/aax2/
75 KB
22 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.157.237 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-157-237.txl52.r.cloudfront.net
Software
Server /
Resource Hash
f31d00a72b38535ab0e9615410790bdd191ce7247198d172e7dcfd6913dbb70f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 23 Sep 2019 17:15:35 GMT
content-encoding
gzip
server
Server
age
58784
etag
cb11f28997167e6ef1527a7077c2cf8c
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
TXL52-C1
accept-ranges
bytes
timing-allow-origin
*
x-amz-cf-id
w-louGjVrV-o5VSvnBxzxXU-8RdBL4WJ5NEBMdIvQG1BbUcVMGzBqQ==
via
1.1 8e2919534da029bb37f64b265b219373.cloudfront.net (CloudFront)
init
d.nativendo.de/cds/delivery/
991 B
917 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
a171e8c7a44d294284e2d33393fe6621a29f5e57ee36602ae422de9955dd957c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Tue, 24 Sep 2019 09:35:19 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
516
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.04001017506300464
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

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000ff66e3038df9535d89e357&ep=1599171302&vr=415&i...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000f&i2=000ff66e3038df9535d89e357&ep=1599171302&vr=415&i...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
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
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Wed, 25 Sep 2019 09:35:19 GMT

Redirect headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0025
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
Tue, 24 Sep 2019 09:35:19 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
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
Mon, 24 Sep 2018 09:35:19 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
9 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?62585758
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-21d69eb55d.css
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
last-modified
Tue, 24 Sep 2019 08:27:07 GMT
server
nginx
accept-language
bytes
etag
"5d89d35b-25d8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
9688
expires
Wed, 23 Sep 2020 09:35:19 GMT
176875
videos.giga.de/embed/ Frame 19CF
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875?autoplay=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d83403588cc6bf8c728659869f5c037d9fd3f51f5db5c7b44adbe2c818e15a55

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875?autoplay=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
same-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
pc=1; ioam2018=000ff66e3038df9535d89e357:1596620119425:1569317719425:.giga.de:2:giga:software_content:noevent:1569317719425:m3jiwq
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.14.1
date
Tue, 24 Sep 2019 09:35:19 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/176875>; rel="canonical"
content-encoding
gzip
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
647 B
865 B
Image
General
Full URL
https://www.giga.de/wp-content/themes/project/assets/img/teaser/bg-teaser.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-21d69eb55d.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 21:57:05 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-287"
status
200
access-control-allow-methods
GET
content-type
image/png
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
647
expires
Thu, 26 Mar 2020 21:57:05 GMT
js
www.google-analytics.com/gtm/
90 KB
27 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=2028231348.1569317719&aip=true
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
dc63b17fec954467b897ae2dd23df2b4df42a6dd7b982cae40c238281c88be92
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
28028
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:19 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
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:806::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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
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"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
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:814::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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
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"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
104
x-xss-protection
0
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190918/r20190131/
219 KB
81 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190918/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:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
fc210097c624aab58388cb77889ef8f56a5fdf2192a1ff0df46153bdee5b9ce0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
82617
x-xss-protection
0
server
cafe
etag
8503094575604046247
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 24 Sep 2019 09:35:19 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190918/r20190131/ Frame F8CE
219 KB
81 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190918/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:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
fc210097c624aab58388cb77889ef8f56a5fdf2192a1ff0df46153bdee5b9ce0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
82617
x-xss-protection
0
server
cafe
etag
8503094575604046247
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 24 Sep 2019 09:35:19 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190918/r20190131/ Frame 90B0
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190918/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:81b::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/r20190918/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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

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
Wed, 18 Sep 2019 14:16:11 GMT
expires
Wed, 02 Oct 2019 14:16:11 GMT
content-type
text/html; charset=UTF-8
etag
14866779439905550351
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7273
x-xss-protection
0
cache-control
public, max-age=1209600
age
501548
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
init
d.nativendo.de/cds/delivery/
3 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
15845f73e9b1a585a2ff66330c607a145fbd745aa367b85af1be26f5d25ccf79

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Tue, 24 Sep 2019 09:35:19 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
1141
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
loader.js
c.nativendo.de/cdn/asset/js/
53 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1169
Requested by
Host: d.nativendo.de
URL: https://d.nativendo.de/cds/delivery/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
dfeedae9c9b83e05b47a24af31e7873037b83174ddcf46e4f65bf4e101172101

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
via
1.1 google
cf-cache-status
HIT
age
344113
cf-polished
origSize=54198
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
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/javascript
cache-control
public, max-age=31536000
cf-ray
51b3c4833dcfcbbc-VIE
expires
Wed, 23 Sep 2020 09:35:19 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.157.237 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-157-237.txl52.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 04:05:26 GMT
content-encoding
gzip
vary
Origin
age
19794
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 24 Aug 2018 07:13:51 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 a3dc4a768d48247641f8ad7f08326d38.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
TXL52-C1
x-amz-cf-id
BjTY9EaRlzF11eLHDcJKUTaXBZWMEJJu0ihjcQum-u6e3qX7FJaX9w==
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.5588873025020658
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
X-Content-Type-Options
nosniff
Last-Modified
Tue, 24 Sep 2019 09:35:19 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Wed, 25 Sep 2019 09:35:12 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame 865D
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

Host
tracking.m6r.eu
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
test=true
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Length
1579
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=7e3d8ee1b515093347ef82a5009dc890; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Mon, 23 Dec 2019 09:35:19 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
302
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Date
Tue, 24 Sep 2019 09:35:19 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Tue, 24 Sep 2019 10:35:19 GMT
gpt.js
www.googletagservices.com/tag/js/
44 KB
14 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
fcfe1e273b77a6901a90e8adf4a68a1ab24f3f6404f96a096ed95b20afe556a1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"288 / 305 of 1000 / last-modified: 1569254818"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
14238
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:19 GMT
bid
c.amazon-adsystem.com/e/dtb/
122 B
506 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=6859348913181569317719521&cb=7627539066171569317719558&ws=1600x1200&v=7.36.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.157.237 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-157-237.txl52.r.cloudfront.net
Software
Server /
Resource Hash
55e0160704ffd59f47564767974aa8cd5bc787702d5fd371d93bab784e65cf67

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
TXL52-C1
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
131
via
1.1 8e2919534da029bb37f64b265b219373.cloudfront.net (CloudFront)
x-amz-cf-id
jpflLp_WpcI8RUjoMCP5m90ZGhGhg9RsUEemDWTfQUvHFYOXpmb4BQ==
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
287 KB
89 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.32.223.253 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-32-223-253.fra56.r.cloudfront.net
Software
/ Express
Resource Hash
096e7af15d6f5f51291b05a81503d82565a5a1324d2e1cfac8a495760f144baa

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 07:03:58 GMT
content-encoding
gzip
age
9081
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA56
x-amz-cf-id
YAqplBaSgCVnABBA7x7iBg3qgblYKSumglrxzk3k5CBTn3hJECk82w==
via
1.1 e430a35037c484cf19f375480cabfca3.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 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
49094
Expires
Tue, 24 Sep 2019 11:35:19 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b8be8937532d85115f5b4bcdd54632c02e1cfbea2d8164a6d3f4b3917ee06c48

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 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.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
108

Redirect headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.giga.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/
2 KB
1 KB
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.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
f3a7b8903fe69fc8990e0e9b121473a8712fdb366bf58cee84fbe85df26ddc1a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 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
614
Expires
Wed, 18 Feb 2009 11:53:30 GMT
ad-loading.gif
www.dunkirkinception.com/detect/
125 B
436 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagez/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.29.62 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-29-62.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
a076460215972ba3aff72729a43dc7989ef8a85dba721e287bc9ccefeae3aa0f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
X-Powered-By
TSAdServer
ETag
W/"7d-dyD3qVGWnWMxHmLFkRxdDzZ9PJk"
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
X-Robots-Tag
noindex, nofollow
Content-Length
125
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:8a00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 23 Sep 2019 15:51:01 GMT
via
1.1 c735fa223fb16fb135c387781f0fadf6.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
63937
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA56
accept-ranges
bytes
content-length
3167
x-amz-cf-id
pvk1zfSCacvQ0IQloqnZ9hGJLceCzwLO9hVQ8wA2s4gUQdVOvsYuuw==
collect
www.google-analytics.com/r/
35 B
111 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1639303930&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=2001710442&gjid=813855484&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=847652980
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:19 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=899911554
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
post-98578dc5ad.js
www.giga.de/static-local/dist/assets/js/bundle/
7 KB
3 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/post-98578dc5ad.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
78abe71a42bb77012210193e88b14d5e4ae964d17f45cda0476d280b9379e1bd

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 17 Sep 2019 09:41:05 GMT
content-encoding
gzip
x-original-content-length
7148
server
nginx
status
200
etag
W/"5d80a9b8-1bec"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2725
expires
Wed, 16 Sep 2020 09:41:05 GMT
giga-6b59f15322.js
www.giga.de/static-local/dist/assets/js/bundle/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-6b59f15322.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 09 Jul 2019 13:24:03 GMT
content-encoding
gzip
x-original-content-length
31346
server
nginx
status
200
etag
W/"5d2494e5-7a72"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11745
expires
Wed, 08 Jul 2020 13:24:03 GMT
smb-phone-plan-ef34ebe4f8.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
53 KB
18 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 11 Sep 2019 09:34:55 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
status
200
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:55 GMT
videojs-02e1d46d.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 19CF
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Tue, 17 Sep 2019 08:48:02 GMT
server
nginx/1.14.1
etag
W/"5d809dc2-9a957"
content-type
application/javascript
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame 19CF
263 KB
89 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c27c80b3fbae6f823e73d838ca5cae4ca8a2ab20118d42f983056d61e51d5d85
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 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,43,39"
content-length
91282
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:19 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame F2F9
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569317719&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1569317719484&bpp=11&bdt=138&fdt=116&idt=116&shv=r20190918&cbv=r20190131&saldr=aa&abxe=1&correlator=7574961517634&frm=20&pv=2&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&ga_fc=0&iag=0&icsg=816317432&dssz=56&mdo=0&mso=0&u_tz=120&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=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064505&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.nirjfwr1wfuz&fsb=1&xpc=IGTMaD6k6b&p=https%3A//www.giga.de&dtd=128
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190918/r20190131/show_ads_impl.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
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-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569317719&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1569317719484&bpp=11&bdt=138&fdt=116&idt=116&shv=r20190918&cbv=r20190131&saldr=aa&abxe=1&correlator=7574961517634&frm=20&pv=2&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&ga_fc=0&iag=0&icsg=816317432&dssz=56&mdo=0&mso=0&u_tz=120&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=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064505&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.nirjfwr1wfuz&fsb=1&xpc=IGTMaD6k6b&p=https%3A//www.giga.de&dtd=128
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

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
Tue, 24 Sep 2019 09:35:19 GMT
server
cafe
content-length
20268
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Tue, 24-Sep-2019 09:50:19 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Tue, 24 Sep 2019 09:35:19 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 KB
29 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/r20190918/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
29169
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:19 GMT
pubads_impl_2019091901.js
securepubads.g.doubleclick.net/gpt/
156 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.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.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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,43,39"
content-length
58568
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:19 GMT
/
d.nativendo.de/cds/dmp/uuid/check/c3b879eb-3b07-414b-ade9-f5670aed5e67/
Redirect Chain
  • https://ih.adscale.de/tpui?tpid=19&tpuid=aadaa111-6bd1-47ec-980c-70facfa8da08&cburl=https%3A%2F%2Fd.nativendo.de%2Fcds%2Fdmp%2Fuuid%3Fuser_id%3D__ADSCALE_USER_ID__%26dsp_id%3D1
  • https://ih.adscale.de/tpui?tpid=19&tpuid=aadaa111-6bd1-47ec-980c-70facfa8da08&cburl=https%3A%2F%2Fd.nativendo.de%2Fcds%2Fdmp%2Fuuid%3Fuser_id%3D__ADSCALE_USER_ID__%26dsp_id%3D1&nut&uu=fa3e41f748b84...
  • https://d.nativendo.de/cds/dmp/uuid?user_id=fa3e41f748b84ae98c59607e004f6e19&dsp_id=1
  • https://d.nativendo.de/cds/dmp/uuid/check/c3b879eb-3b07-414b-ade9-f5670aed5e67/
0
170 B
Script
General
Full URL
https://d.nativendo.de/cds/dmp/uuid/check/c3b879eb-3b07-414b-ade9-f5670aed5e67/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:21 GMT
via
1.1 google
last-modified
Tue, 24 Sep 2019 09:35:21 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:21 GMT
via
1.1 google
last-modified
Tue, 24 Sep 2019 09:35:21 GMT
server
Apache
status
307
p3p
CP="This is not a p3p policy."
location
https://d.nativendo.de/cds/dmp/uuid/check/c3b879eb-3b07-414b-ade9-f5670aed5e67/
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 19CF
53 KB
15 KB
Stylesheet
General
Full URL
https://videos.giga.de/dist/css/videojs-f50f7a8d.css
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Tue, 17 Sep 2019 08:48:02 GMT
server
nginx/1.14.1
etag
W/"5d809dc2-d280"
content-type
text/css
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
play_button.svg
videos.giga.de/image/ Frame 19CF
1015 B
1 KB
Image
General
Full URL
https://videos.giga.de/image/play_button.svg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Mon, 23 Dec 2019 09:35:19 GMT
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1569317719624&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:19 GMT
Last-Modified
Wed, 16 Sep 2009 09:33:52 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Tue, 18 Sep 2012 09:33:52 GMT
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 21:57:05 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
status
200
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
234
expires
Thu, 26 Mar 2020 21:57:05 GMT
submit
lb100.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb100.s400.meetrics.net/bb-mx/submit?/e58qBHAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSaKBPAAAAAAAAAOAAAAGAAAAAAAZwSaKBBRksFAQtjF4ke9SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:19 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Tue, 24 Sep 2019 09:35:18 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/e58qCHAAATkzFARksFAQtjFWqJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:19 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:18 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame DAED
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569317719&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569317719563&bpp=3&bdt=217&fdt=88&idt=88&shv=r20190918&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7574961517634&frm=20&pv=1&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&ga_fc=0&iag=0&icsg=2251812874764216&dssz=61&mdo=0&mso=0&u_tz=120&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=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064505&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.4ybpw68kj92x&fsb=1&dtd=93
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190918/r20190131/show_ads_impl.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
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-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569317719&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569317719563&bpp=3&bdt=217&fdt=88&idt=88&shv=r20190918&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7574961517634&frm=20&pv=1&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&ga_fc=0&iag=0&icsg=2251812874764216&dssz=61&mdo=0&mso=0&u_tz=120&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=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21064505&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.4ybpw68kj92x&fsb=1&dtd=93
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
test_cookie=CheckForPermission
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

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
date
Tue, 24 Sep 2019 09:35:19 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT IDE=AHWqTUkzBnifE_oFbfIFuvIbluazPsf6U0XnNk0GNrclDKaJ0TXx3UboBH9Gwc4l; expires=Sun, 18-Oct-2020 09:35:19 GMT; path=/; domain=.doubleclick.net; HttpOnly
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Tue, 24 Sep 2019 09:35:19 GMT
cache-control
private
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1169
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1169
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
via
1.1 google
cf-cache-status
HIT
age
344113
cf-polished
origSize=5959
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
text/css;charset=UTF-8
cache-control
public, max-age=31536000
cf-ray
51b3c483efa8cbbc-VIE
expires
Wed, 23 Sep 2020 09:35:19 GMT
dkuim.js
dkuim.de/api/js/2/
465 KB
151 KB
Script
General
Full URL
https://dkuim.de/api/js/2/dkuim.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.65.130 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Encoding
gzip
Last-Modified
Tue, 11 Dec 2018 15:40:09 GMT
Server
nginx
ETag
W/"5c0fda59-74548"
Transfer-Encoding
chunked
Content-Type
application/javascript
adslots.-ecTGK0.gif
www.giga.de/imagez/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagez/adslots.-ecTGK0.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
server
nginx
x-powered-by
TSAdServer
etag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
content-type
image/png
status
200
cache-control
no-cache, no-store, must-revalidate, no-cache="set-cookie"
x-robots-tag
noindex, nofollow
content-length
71
Cookie set /
d.agkn.com/iframe/8613/ Frame 963E
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=921303493&gdpr=&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.148.3 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-148-3.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, must-revalidate
Content-Type
text/html;charset=UTF-8
Date
Tue, 24 Sep 2019 09:35:19 GMT
Expires
Sat, 01 Jan 2000 00:00:00 GMT
P3P
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Pragma
no-cache
Server
Apache-Coyote/1.1
Set-Cookie
ab=0001%3AsJp3ZAxydAsHmGQZ5dvbtgNJdbIx1N1H;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlHJ_XJRyf1wAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
481
Connection
keep-alive
platform.js
apis.google.com/js/
43 KB
17 KB
Script
General
Full URL
https://apis.google.com/js/platform.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
ESF /
Resource Hash
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-sSFJIyUboZ3n+SHCIS0E8Q' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval';object-src 'none';base-uri 'self';report-uri /_/cspreport
p3p
CP="This is not a P3P policy! See g.co/p3phelp for more info."
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
x-xss-protection
0
x-ua-compatible
IE=edge, chrome=1
server
ESF
x-frame-options
SAMEORIGIN
etag
"ce8f41226b511978bd0b369f1ffcc6fc"
strict-transport-security
max-age=31536000
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=1800, stale-while-revalidate=1800
timing-allow-origin
*
expires
Tue, 24 Sep 2019 09:35:19 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
113 KB
22 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/bundle/post-98578dc5ad.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
002309837aa64a1802f6e1101c89fc2a37b7d1d648d965a4b2198717b3f374f8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
cQIpaKHFiH.WSLZE26bp4pC3hx1r0kR7
content-encoding
gzip
etag
"1553d98c2750bb880fccfa593546036c"
age
18
x-cache
HIT
status
200
content-length
22068
x-amz-id-2
RPUFxzga7iKbYw0RlncaqIlCY7GVPtM4kICU+iYoRgbW0XpQ16jHhsgzbgWQ10yJvhnCXzY0cHg=
x-served-by
cache-fra19143-FRA
last-modified
Thu, 19 Sep 2019 08:15:01 GMT
server
AmazonS3
x-timer
S1569317720.719585,VS0,VE0
date
Tue, 24 Sep 2019 09:35:19 GMT
vary
Accept-Encoding
x-amz-request-id
3DA1A6064C1BC95E
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
23
x-cache-hits
2
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=463804727
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=2054279560
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=273360643
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=2059767000
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=648850911
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=1143528065
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=651391547
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
85 KB
30 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 26 Aug 2019 08:21:25 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
2510034
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Tue, 25 Aug 2020 08:21:25 GMT
smb-article-rating-f9506c2d61.min.js
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
18 KB
6 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:19:29 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
status
200
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:19:29 GMT
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 19CF
30 KB
30 KB
Image
General
Full URL
https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 09 Sep 2019 04:01:55 GMT
x-content-type-options
nosniff
age
1316004
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Sat, 24 Aug 2019 05:59:04 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 23 Sep 2019 05:59:04 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1288616205
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
11 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2709645205801502&correlator=901214958295510&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21064620%2C21062414%2C21062833%2C21062889%2C21064549&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190924&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D16%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D385e248010686f30324fc61ba2109da3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569317719&dt=1569317719807&dlt=1569317719346&idt=447&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&u_tz=120&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=66&icsg=3343636213816&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
ed5cd9fd6cd52d4f09b4d30683ce8a45357e5c87dacae6103ba309bc24da5f20
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 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
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
4436
x-xss-protection
0
google-lineitem-id
5002100619
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265057624
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.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_2019091901.js
securepubads.g.doubleclick.net/gpt/
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 19 Sep 2019 13:07:51 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,43,39"
content-length
24151
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:19 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2709645205801502&correlator=901214958295510&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21064620%2C21062414%2C21062833%2C21062889%2C21064549&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190924&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D16%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D385e248010686f30324fc61ba2109da3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1569317719&dt=1569317719818&dlt=1569317719346&idt=447&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&u_tz=120&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=67&icsg=3343636213816&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
769e8af580cea4d3d9ec3ffae656299666510e1a6f942c791f4feafc9e145021
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 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
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
1757
x-xss-protection
0
google-lineitem-id
4482388292
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138216245372
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=1504522195
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767537
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame F7AA
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.216.48 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

Host
aax-eu.amazon-adsystem.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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=A0600x3Cxkd4jCjCPb1fM7w|t
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Server
Date
Tue, 24 Sep 2019 09:35:20 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
181
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Set-Cookie
ad-id=A0600x3Cxkd4jCjCPb1fM7w; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 09:35:19 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Tue, 01-Oct-2024 09:35:20 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Length
0
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Location
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Set-Cookie
ad-id=A0600x3Cxkd4jCjCPb1fM7w|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 09:35:19 GMT; Path=/; HttpOnly
Vary
User-Agent
80955b21-6373-4154-baa8-06bd34febe50
https://videos.giga.de/ Frame 19CF
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/80955b21-6373-4154-baa8-06bd34febe50
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

Sec-Fetch-Mode
same-origin
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Length
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 19CF
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.199 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Last-Modified
Tue, 24 Sep 2019 09:12:04 GMT
Server
AmazonS3
x-amz-request-id
D05D73E6E8B2FF7C
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
ETCFArkBEo/I3VeW8qDkMNWw7Lx2Ru5ED7gzCXYyr/uNCcoeGyr2rsMZ5SaKfLa8Kwe4Sh+dVfc=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 19CF
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Tue, 24 Sep 2019 09:50:19 GMT
impl.20190919-3-RELEASE.js
cdn.taboola.com/libtrc/
393 KB
111 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
396bf68eca1ce17182ad5a282b4eac1039766aabac1d446c8b457d558a8ca249

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
ywY2pFnXinTCxDdANLkBaBrFYv3B4A7L
content-encoding
gzip
etag
"56e1ff0c4b5f21984579482845c70023"
age
114
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
113787
x-amz-id-2
y0RVWWukvsScu8juY5KPUcKcKNr5EPqZehdkeYbrVIOEKiQQtnICZUQf3FslhtXqhMEemOtzDmM=
x-served-by
cache-fra19143-FRA
last-modified
Sun, 22 Sep 2019 13:28:22 GMT
server
AmazonS3
x-timer
S1569317720.858443,VS0,VE0
date
Tue, 24 Sep 2019 09:35:19 GMT
vary
Accept-Encoding
x-amz-request-id
008DEEA16E0134A0
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
44
x-cache-hits
487
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
private, no-transform, max-age=86400
Connection
keep-alive
Content-Length
902
Expires
Wed, 25 Sep 2019 09:35:19 GMT
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c98fb5a50e.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:2a , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
status
200
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Sep 2019 12:52:15 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
654
Expires
Wed, 25 Sep 2019 09:35:21 GMT
bid
c.amazon-adsystem.com/e/dtb/
47 B
392 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=6859348913181569317719521&cb=1877180368031569317719924&ws=1600x1200&v=7.36.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.157.237 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-157-237.txl52.r.cloudfront.net
Software
Server /
Resource Hash
9dfd8038d48cd1f5dc20da31883be4c9c122fede4fedecd14900e9378ee4e15e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 8e2919534da029bb37f64b265b219373.cloudfront.net (CloudFront)
server
Server
x-amz-cf-pop
TXL52-C1
status
200
vary
User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
47
x-amz-cf-id
dqBcYu_US06FgkkB1OaunDNc6qXbR9blrIWE2ARXTguUO-mNuY5knA==
prebid
ib.adnxs.com/ut/v3/
1 KB
2 KB
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?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.221 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
316.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
25cfddb5930c26596981a0215bc7675b1bd4a096a92b705ead424d72741570ab
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Content-Encoding
gzip
Transfer-Encoding
chunked
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"
Connection
keep-alive
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.47:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
f5add9bf-bb9f-476a-8f69-0ea33eb5c6a8
Server
nginx/1.13.4
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Expires
Sat, 15 Nov 2008 16:00:00 GMT
arj
yieldlove-d.openx.net/w/1.0/
4 KB
5 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=50213012-078f-49d9-b340-3f2b94925140%2C0f9d5557-5e71-4ff3-a325-b246a48239fe%2C3f50fe90-81d3-46a9-86c1-ee3a9e13c7b0&nocache=1569317719931&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash
ec52c8556442bbc31b7aa141f1c763077aade898b98e68fb13366bd668fe9349

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:19 GMT
via
1.1 google
server
OXGW/16.163.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.giga.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
4403
expires
Mon, 26 Jul 1997 05:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 19CF
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.151.92 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-151-92.txl52.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:34:48 GMT
Via
1.1 fa133af2508a341e1ff6bfff526ba095.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
33
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
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
X-Amz-Cf-Pop
TXL52-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
RcDcXe41f-fKHa2fFg35ppMdnihqSPJLPvMapGGoa49ozESRoI_INg==
Expires
0
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
51 KB
13 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3a2d4215ea29f3c884ac860a469540231fe161f939da2461195a2b8c0fc6b830

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Encoding
gzip
Age
234
X-Cache
HIT
Connection
keep-alive
Content-Length
12414
x-amz-id-2
ZoDyH7IAIwYeLY3tWjYGYd84BTjsoO1bp3lzqA44OKptdRqQ+18zIJQ/vWDQpxy28P7IjRIKkj8=
X-Served-By
cache-fra19168-FRA
Last-Modified
Tue, 24 Sep 2019 09:26:51 GMT
Server
AmazonS3
X-Timer
S1569317720.960784,VS0,VE0
ETag
"b86ad0fa8f9f05fe442db7919c0c3134"
x-amz-request-id
F6242864138A4DE7
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
506
/
d.nativendo.de/cds/delivery/get/
8 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1169
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
65355070c60fbbd74428ad9ad389260b8d7231d1750cf20a805d60d693f32614

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:19 GMT
content-encoding
gzip
last-modified
Tue, 24 Sep 2019 09:35:19 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
1719
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1569317719950&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1569317719950&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapp...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1569317719950&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:19 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1569317719950&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:19 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
json
trc.taboola.com/stroeer-smb-giga/trc/3/
16 KB
7 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=11%3A35%3A19.973&lti=deflated&data=%7B%22id%22%3A637%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1569317719967%2C%22cv%22%3A%2220190919-3-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A4652%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3055.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
c72d7c1c42a5bbc5f5f0b0056795d38673858d6972688ae0ff9f345cfd5f1f58

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
server
nginx
x-timer
S1569317720.977975,VS0,VE184
status
200
x-served-by
cache-hhn4078-HHN
vary
Accept-Encoding
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
*
access-control-allow-credentials
true
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
via
1.1 varnish
x-cache-hits
0
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201909161255/
25 KB
10 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bf6dfeb55238667742261daf868564936c9c32468d2a3a8e32c8ded0e0627601

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:19 GMT
Content-Encoding
gzip
Age
568
X-Cache
HIT
Connection
keep-alive
Content-Length
9682
x-amz-id-2
qaieBehsiZt5XlztHeQZO78rbZryGXJ3B+YvdIUzh/ZNUvWX0Ft+7q/r5R9bMXzd7SQSmTqSR9Y=
X-Served-By
cache-fra19168-FRA
Last-Modified
Tue, 17 Sep 2019 17:19:39 GMT
Server
AmazonS3
X-Timer
S1569317720.983204,VS0,VE0
ETag
"1a63fd335ff2c1f355dbad15f6672704"
x-amz-request-id
1EDE41A65C744F4C
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
883
native
native.adscale.de/
Redirect Chain
  • https://native.adscale.de/native
  • https://native.adscale.de/native?uu=b1f3ebd68ba744b185fe0c296191b0de
157 B
603 B
XHR
General
Full URL
https://native.adscale.de/native?uu=b1f3ebd68ba744b185fe0c296191b0de
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
184.30.220.71 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a184-30-220-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d50463d8618378a690bc1e1b3de82edef05c4575df03df20cb165d610c394a9c

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
P3P
CP=NOI PSA OUR
Content-Type
application/json
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
157

Redirect headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Access-Control-Allow-Origin
https://www.giga.de
P3P
CP=NOI PSA OUR
Location
//native.adscale.de/native?uu=b1f3ebd68ba744b185fe0c296191b0de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
0
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 19CF
202 KB
58 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=FCZwnRKiyB
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.151.92 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-151-92.txl52.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
464f66b4c2e5fa054b0a1b576bed2c440da7f23379aabab11e2ff312b8a74f08

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:16 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
5
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Wed, 18 Sep 2019 12:30:23 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 fa133af2508a341e1ff6bfff526ba095.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
TXL52-C1
X-Amz-Cf-Id
QOfN92hMYTi94ix2-yAfHIykTMjjlHlgTtd7kgHQiac8MbQHzi9K4g==
ads
securepubads.g.doubleclick.net/gampad/
11 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2709645205801502&correlator=901214958295510&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21064620%2C21062414%2C21062833%2C21062889%2C21064549&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190924&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D16%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D385e248010686f30324fc61ba2109da3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-4%252Cn71-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1&cookie_enabled=1&bc=31&abxe=1&lmt=1569317720&dt=1569317720044&dlt=1569317719346&idt=447&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1797203554&uci=3&ifi=4&u_tz=120&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=75&icsg=855970870734880&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
95af08216dafc14cd81ed5384e88ea447fef294c2de3bd2a5fa0a3f5e477244f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 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
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
5010
x-xss-protection
0
google-lineitem-id
5174380267
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138287418888
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2709645205801502&correlator=901214958295510&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21064620%2C21062414%2C21062833%2C21062889%2C21064549&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190924&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D16%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D385e248010686f30324fc61ba2109da3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-4%252Cn71-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1&cookie_enabled=1&bc=31&abxe=1&lmt=1569317720&dt=1569317720051&dlt=1569317719346&idt=447&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1819065434&uci=4&ifi=5&u_tz=120&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=75&icsg=855970870734880&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
9727c6d01f0396bcd2f3cc25f7540510f6d8174c83275e4642309a9809adc0ac
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 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
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
3772
x-xss-protection
0
google-lineitem-id
5174380267
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138287841772
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2709645205801502&correlator=901214958295510&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21064620%2C21062414%2C21062833%2C21062889%2C21064549&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190924&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D16%26smb-hour%3D11%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3D385e248010686f30324fc61ba2109da3%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D%26mbrStatus%3Dcalled-idfound%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn70-4%252Cn71-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1&cookie_enabled=1&bc=31&abxe=1&lmt=1569317720&dt=1569317720058&dlt=1569317719346&idt=447&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3179048887&uci=5&ifi=6&u_tz=120&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=75&icsg=855970870734880&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=2028231348.1569317719&ga_sid=1569317720&ga_hid=1639303930&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
5bef04e02f52ff6896f6bafeedd65fff82e76129f7db11338a590e90da2e57fb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 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
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
3228
x-xss-protection
0
google-lineitem-id
5005878418
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265003623
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
truncated
/ Frame 19CF
202 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
464f66b4c2e5fa054b0a1b576bed2c440da7f23379aabab11e2ff312b8a74f08

Request headers

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

Response headers

Content-Type
text/javascript
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
QigX3ZX5MGiAmAJwYlP84.EpHqCiK9Yx
Content-Encoding
gzip
Last-Modified
Thu, 05 Sep 2019 23:46:39 GMT
Server
AmazonS3
x-amz-request-id
31BE18F60EE95BB3
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Tue, 24 Sep 2019 09:35:21 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
IdaVAl1604pfq6JwXhPQZmq7SpSyJoUJfwVVhRXUnMBWynW8rBQqVfzyqc7y5KqDybLXGD8qdIs=
0
d.nativendo.de/cds/delivery/render/54k4st8g/182yo/2oidc/7lk3k/
4 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/54k4st8g/182yo/2oidc/7lk3k/0
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
d1e63ab0c35177828f3d36617564ffc24333485ee51cb1a55340a3a577741ee8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
last-modified
Tue, 24 Sep 2019 09:35:20 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
1474
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
c2a16c16-a57b-463b-8271-3126ecdd1b70
t.nativendo.de/cds/tracking/event/
0
194 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/c2a16c16-a57b-463b-8271-3126ecdd1b70?aid=182yo&floor=YzJhMTZjMTYtYTU3Yi00NtIhTnkPTB9Z8U2xeg&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1569317720
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 google
last-modified
Tue, 24 Sep 2019 09:35:20 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
2f19f24b-7b6a-4197-83c4-f8d42aba9afd.jpg
c.nativendo.de/cdn/asset/media/crt/23753/2/3/
51 KB
51 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/23753/2/3/2f19f24b-7b6a-4197-83c4-f8d42aba9afd.jpg?v=1566565382&width=350
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ad0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
bd5e2011016dd5e73ac3488dede054932251fc9a5b4f06a65d8ff1d962869136

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 google
cf-cache-status
HIT
age
2022935
cf-polished
origSize=56604, status=webp_bigger
status
200
alt-svc
clear
content-length
51773
cf-bgj
imgq:100
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
image/jpeg
cache-control
public, max-age=31536000
accept-ranges
bytes
cf-ray
51b3c486ffbfcbbc-VIE
expires
Wed, 23 Sep 2020 09:35:20 GMT
c2a16c16-a57b-463b-8271-3126ecdd1b70
t.nativendo.de/cds/tracking/event/
0
169 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/c2a16c16-a57b-463b-8271-3126ecdd1b70?noc=54k4st8g&aid=182yo&cid=2oidc&cti=7lk3k&imp=1&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1569317720
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 google
last-modified
Tue, 24 Sep 2019 09:35:20 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
tb
15.taboola.com/
30 KB
30 KB
Script
General
Full URL
https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1569317720172&tagid=&cntry=DE&platform=1&sesid=957b4c01979cf24b52160e61da489d68&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1569317719967&geolat=&geoing=&deviceifa=&appid=&sd=v2_957b4c01979cf24b52160e61da489d68_c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7_1569317719_1569317719_CNawjgYQrMVBGJ-fgJXWLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=ca814ddce7c6a4dd01133358fa92b15b&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
dc3bd538f2f2905a1f98e5b6fca1977b0b5b66cfc4e7333caed826f7d3148f4f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317720.192973,VS0,VE242
machineid
1416
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
expires
Sat, 26 Jul 1997 05:00:00 GMT
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19124-FRA
feed-card-placeholder.20190919-3-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20190919-3-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
56d19889571d5a2a2067e879a75c87bee10e25e5dc98472e8a372fd14682302a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
IX10dL1N4foqbdgRTBRNNjEO_12UrYX1
content-encoding
gzip
etag
"45193efc191a15bfd45ad9ebab13b4bc"
age
91
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
1289
x-amz-id-2
CGgyf1ONFHrku5+wBqqIBdiljsD3CM1h0f7rCGwLuIRMlVojfkCWniP6x8L9bAtFU9Se/C1H4Nc=
x-served-by
cache-fra19143-FRA
last-modified
Sun, 22 Sep 2019 13:28:41 GMT
server
AmazonS3
x-timer
S1569317720.176552,VS0,VE0
date
Tue, 24 Sep 2019 09:35:20 GMT
vary
Accept-Encoding
x-amz-request-id
57AF27B6CC8E9143
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
14
x-cache-hits
296
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
4 KB
2 KB
Image
General
Full URL
https://cdn.taboola.com/static/f8/f89e1763-220d-4e09-ba69-9e040548fb7a.svg
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
age
104
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
jvOSZ/pvYbbg+VNOKGWGEcP27x0d1oSka6Vh67caoyL1DXUEh82vNeaN+5ZhEZGStse+MTvzqBY=
x-served-by
cache-fra19143-FRA
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1569317720.178588,VS0,VE0
date
Tue, 24 Sep 2019 09:35:20 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
290F68BD355FFAA8
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
14
x-cache-hits
248
userx.20190919-3-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20190919-3-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
40881f2ea8191b832d838358e1577f1dcdcae71ce4277a3d38498e1c8a0e9f05

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
90.DKSJPxb81kiBxa5RR2UZ9G8pVPPHw
content-encoding
gzip
etag
"14b6f33c3f7d321bf1ebc7891256b4e7"
age
52
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
7735
x-amz-id-2
oIvIBnCRFwGNCNSefJSKQ3lNir97I+QDwu172aEWyRoP+/XQOufdMwN3SW6t8KBt//vIqqhZLfQ=
x-served-by
cache-fra19143-FRA
last-modified
Sun, 22 Sep 2019 13:28:47 GMT
server
AmazonS3
x-timer
S1569317720.186039,VS0,VE0
date
Tue, 24 Sep 2019 09:35:20 GMT
vary
Accept-Encoding
x-amz-request-id
C762F532548A8065
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
14
x-cache-hits
97
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame 1C76
Redirect Chain
  • https://rtb.mfadsrvr.com/sync?ssp=taboola
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=79647db2-724f-48ea-8e93-1b277d07c21c
0
49 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=79647db2-724f-48ea-8e93-1b277d07c21c
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.244203,VS0,VE8
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4078-HHN

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=79647db2-724f-48ea-8e93-1b277d07c21c
Date
Tue, 24 Sep 2019 09:35:20 GMT
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
sync.php
pixel.rubiconproject.com/exchange/ Frame 1C76
0
239 B
Image
General
Full URL
https://pixel.rubiconproject.com/exchange/sync.php?p=16698
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_GCM
Server
69.173.144.165 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Expires
0
Cache-Control
no-cache,no-store,must-revalidate
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
X-RPHost
37b22a0c36bd84993dd2cda4a5e04b1d
Content-Type
image/gif
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 1C76
Redirect Chain
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=HlTR7n3JFhIKzXo19ZA7oTBX38q_DbT3S3-YQPXoV0A%3D
45 B
103 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=HlTR7n3JFhIKzXo19ZA7oTBX38q_DbT3S3-YQPXoV0A%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.242070,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4078-HHN

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=HlTR7n3JFhIKzXo19ZA7oTBX38q_DbT3S3-YQPXoV0A%3D
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
nginx
Connection
close
Etag
"HlTR7n3JFhIKzXo19ZA7oTBX38q_DbT3S3-YQPXoV0A="
Content-Length
0
rtb-h
match.taboola.com/sg/appnexus-network/1/ Frame 1C76
Redirect Chain
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
  • https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=8530186435669027651
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=8530186435669027651&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D8530186435669027651
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=8530186435669027651&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D8530186435669027651
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317720.239143,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19124-FRA

Redirect headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.223284,VS0,VE8
x-served-by
cache-hhn4078-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=8530186435669027651&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D8530186435669027651
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/google-network/1/ Frame 1C76
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEFW1Ucrf84ZzSic6cFk_Fqk&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFW1Ucrf84ZzSic6cFk_Fqk&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3DCAESEFW1Ucrf84ZzSic6cFk_Fqk%26goo...
0
153 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFW1Ucrf84ZzSic6cFk_Fqk&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3DCAESEFW1Ucrf84ZzSic6cFk_Fqk%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317720.239186,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19124-FRA

Redirect headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.223434,VS0,VE8
x-served-by
cache-hhn4078-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEFW1Ucrf84ZzSic6cFk_Fqk&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3DCAESEFW1Ucrf84ZzSic6cFk_Fqk%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/ Frame 1C76
Redirect Chain
  • https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
  • https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=8530186435669027651
0
49 B
Image
General
Full URL
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=8530186435669027651
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.238018,VS0,VE8
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4078-HHN

Redirect headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:22 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.44:80
AN-X-Request-Uuid
a476c937-517e-4e5f-9b81-1deb5b34d90a
Server
nginx/1.13.4
Access-Control-Allow-Origin
*
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"
Location
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=8530186435669027651
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/thetradedesk-network/1/ Frame 1C76
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=f76dcd2a-d6ac-4c59-96df-20ab243f5eaf
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=f76dcd2a-d6ac-4c59-96df-20ab243f5eaf&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Df76dcd2a-d6ac-4c59...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=f76dcd2a-d6ac-4c59-96df-20ab243f5eaf&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Df76dcd2a-d6ac-4c59-96df-20ab243f5eaf
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317720.250731,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19124-FRA

Redirect headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.236588,VS0,VE8
x-served-by
cache-hhn4078-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=f76dcd2a-d6ac-4c59-96df-20ab243f5eaf&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Df76dcd2a-d6ac-4c59-96df-20ab243f5eaf
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame 1C76
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=09ca3ed7-d059-4eeb-ac62-ca79da567b69
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=09ca3ed7-d059-4eeb-ac62-ca79da567b69&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D09ca3ed7-d059-4eeb-ac...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=09ca3ed7-d059-4eeb-ac62-ca79da567b69&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D09ca3ed7-d059-4eeb-ac62-ca79da567b69
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317721.820410,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19124-FRA

Redirect headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317721.806123,VS0,VE8
x-served-by
cache-hhn4078-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=09ca3ed7-d059-4eeb-ac62-ca79da567b69&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3D09ca3ed7-d059-4eeb-ac62-ca79da567b69
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame 1C76
35 B
380 B
Image
General
Full URL
https://bttrack.com/pixel/cookiesync?source=14b8c562-d12b-418b-b680-ad517d5839ec
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
192.132.33.46 , United States, ASN18568 (BIDTELLECT - Bidtellect Inc., US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

X-ServerName
Track002-dc3
Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:19 GMT
X-AspNetMvc-Version
5.2
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
P3P
CP="CAO DSP COR ADMo DEVo PSAo PSDo HISo IVAo IVDo OUR IND OTC"
Cache-Control
private,no-cache
Content-Type
image/gif
Content-Length
35
Expires
-1
/
cds.taboola.com/ Frame 1C76
0
292 B
Image
General
Full URL
https://cds.taboola.com/?uid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&_r=6746146
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
130.211.13.252 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
252.13.211.130.bc.googleusercontent.com
Software
nginx/1.12.2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Via
1.1 varnish
Server
nginx/1.12.2
X-Timer
S1569317720.485610,VS0,VE9
X-Served-By
cache-dca17772-DCA
X-Cache
MISS
x-envoy-upstream-service-time
0
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
rtb-h
match.taboola.com/sg/bidswitch-network/1/ Frame 1C76
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://cm.smadex.com/pixel?sm_did=bds&bds_ssp_id=taboola&bds_param=d95cd948-bc58-431c-b957-8488855ee0c2
  • https://cm.smadex.com/pixel?sm_did=bds&bds_ssp_id=taboola&bds_param=d95cd948-bc58-431c-b957-8488855ee0c2&sm_tc=
  • https://cm.g.doubleclick.net/pixel?google_nid=smadex_2&google_hm=T2w0dlBZd01TNnFsWUFVSERwS1hNUT09&sm_p=dc&sm_r=bds
  • https://cm.smadex.com/sync?sm_p=dc&sm_r=bds
  • https://x.bidswitch.net/sync?dsp_id=340&user_id=3a5e2f3d-8c0c-4baa-a560-05070e929731&expires=10
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=d95cd948-bc58-431c-b957-8488855ee0c2
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=d95cd948-bc58-431c-b957-8488855ee0c2&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Dd95cd948-bc58-431c-b9...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=d95cd948-bc58-431c-b957-8488855ee0c2&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Dd95cd948-bc58-431c-b957-8488855ee0c2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317721.986731,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19124-FRA

Redirect headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317721.972628,VS0,VE8
x-served-by
cache-hhn4078-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=d95cd948-bc58-431c-b957-8488855ee0c2&tbid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7&query=taboola_hm%3Dd95cd948-bc58-431c-b957-8488855ee0c2
accept-ranges
bytes
content-length
0
x-cache-hits
0
collect
www.google-analytics.com/
35 B
110 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=1434175927
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767538
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
90 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=852&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.211947,VS0,VE9
x-served-by
cache-hhn4078-HHN
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
54 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=852&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.212382,VS0,VE9
x-served-by
cache-hhn4078-HHN
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
54 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=852&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.213741,VS0,VE9
x-served-by
cache-hhn4078-HHN
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
54 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=852&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
server
nginx
x-timer
S1569317720.214789,VS0,VE8
x-served-by
cache-hhn4078-HHN
status
204
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
content-type
image/gif
x-cache-hits
0
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
697 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
age
20609
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
Vjnfq2okxpLEG/cBVxSfv3DOOCGN7KTpixt29L7DwUhoZL6eRlgDSODZqhfatrYL58q01gaLKf4=
x-served-by
cache-fra19143-FRA
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1569317720.254924,VS0,VE0
date
Tue, 24 Sep 2019 09:35:20 GMT
x-amz-request-id
F6D91014AAA6CDC4
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
14
x-cache-hits
31943
view
securepubads.g.doubleclick.net/pcs/ Frame 0120
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv-yOcDuZTdRfnnWzGwivo33swm_-uNY5K_WsQNYDX2SVJGlZGmSuG5MLaOtsrmlAtvt4de8u6s6iIiGsEdtdGCDWF4B-6im7vnvEPU6Ai_JZ0keGXHmpqLna66-CdsGe5D0MC-hA5WXXSLw9Fiw-hIDq3iAPFvIQChD8Swkh6c5gLXyO_YNaTfwXoyhDVTdI502vssRJGeGEe12vC6_ysAwSgPO1dHA-A-t1lxA3_MwOMT1UUHOvRZi5JjsoWYBwQZl0RlbWfw0OQ4mLW7JsC7dQ&sig=Cg0ArKJSzBlbr1BWFanNEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:20 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,43,39"
content-length
0
x-xss-protection
0
video.php
media.oadts.com/www/delivery/ Frame 0120
108 KB
108 KB
Script
General
Full URL
https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
6c7ed2d548e889f2bd271cc326596ba4ad529474c3881bf3fcbc39d8d3213706

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Cache-Control
private, max-age=0, no-cache
Server
lighttpd/1.4.45
Content-type
text/javascript; charset=UTF-8
Content-Length
110249
Expires
Mon, 26 Jul 1997 05:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0120
78 KB
29 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
29692
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:20 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame D4BB
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsssYentSJebTjCFTP8Hcc7P2ebzEAMOfqZ9jq1RGMLGlIlErcjFPt9CwIujxfyjQQGEj6a9F8J1ZEd_XsOZRGI2s0jQdJOk4ME7DcbsjemJAIL1GVWV198D6xf76In1xGn4MInqCaT_R...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
344 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=177674
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Thu, 26 Sep 2019 10:56:34 GMT

Redirect headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:20 GMT
x-content-type-options
nosniff
server
cafe
status
302
location
//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
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
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
0
x-xss-protection
0
c2a16c16-a57b-463b-8271-3126ecdd1b70
t.nativendo.de/cds/tracking/event/
0
169 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/c2a16c16-a57b-463b-8271-3126ecdd1b70?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1569317720
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 google
last-modified
Tue, 24 Sep 2019 09:35:20 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0120
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=27528848034
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0120
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=97164620810
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0120
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=78982215604
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
avc.php
media.oadts.com/www/delivery/ Frame 0120
12 KB
12 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg5989901628&startmuted=1&cb=0.6620636712489079&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
5ccf0af7b33cec4723d8a1d648cb83f9cd3817aff291d9ca4b591ce8d1db137d

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
lighttpd/1.4.45
Access-Control-Max-Age
86400
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, max-age=0, no-cache
Access-Control-Allow-Credentials
true
Content-type
application/json
Content-Length
11803
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0120
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=71022830465
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
getAd
video-adserver.ibillboard.com/ Frame 0120
1 KB
1 KB
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=12535787fd&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
2ce8d6a0b051a9aa7cb5296b3a7597556465c94ea6adba975723976f7bd682d9

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
1033
Expires
Tue, 01 Jan 1991 00:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 0120
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.5270939591631234&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 19CF
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=7494389655
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.199 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Last-Modified
Tue, 24 Sep 2019 09:12:04 GMT
Server
AmazonS3
x-amz-request-id
409AE41FF8F9993A
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
BbxhRGo5ICxw5dw+XcWOtmb0ES18riqw9iRIvEbpP5WbCTLl1ge38ah5BoHGkReLkC6405VRctQ=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 19CF
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=3696771796
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Tue, 24 Sep 2019 09:50:20 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 19CF
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1460528440
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.84.151.92 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-84-151-92.txl52.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:34:42 GMT
Via
1.1 fa133af2508a341e1ff6bfff526ba095.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
94
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
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
X-Amz-Cf-Pop
TXL52-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
14JdaLKB8QkCRpeLojbwUrWocvlaCHNMiqYaIx2njWOjv801EBltmw==
Expires
0
creative_js.js
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
4 KB
2 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 a436b6df4b0d1bd189edf722b5d2a523.cloudfront.net (CloudFront), 1.1 varnish
age
805350
x-amz-meta-mtime
1499351521
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
1827
x-served-by
cache-fra19143-FRA
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1569317720.497463,VS0,VE0
etag
"0df6cb700db4e2c8b3b7dcb734e91cb0"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Bz1oMGf3im0GdaDR1lpP366TMdyCBt5NXOq1IlamWrJqJW2zqe6XsA==
x-cache-hits
1546002
/
ssl.3.damoh.giga.de/967fc898c95a8b29acfab8fb3651da8f02389dca/ Frame 19CF
653 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.giga.de/967fc898c95a8b29acfab8fb3651da8f02389dca/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.113.38 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.38.113.9.5.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Tue, 24 Sep 2019 09:35:23 GMT
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:24 GMT
Server
AmazonS3
Etag
"063da71572f57793ea4125f50b418f84"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.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
de36-homad-2
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.giga.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
st
imprammp.taboola.com/ Frame AE35
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=1AE97D881841987170235317255&cicmp=1657475&cijs=1&dast=V7TRoCFgPOKGtV09RuTATOKGtV09RuTAUAAAAGBvQHHLFgMXcj4nAxHC2Ww91itlwMVsvRbDcZbqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQxkCqOTQX6C5RAWIRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQJgYaAZalOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PZBc7SamjWGx3C03Nsto4posZoOVbTFymIbLkW24vTkKSNfokpCHvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhxjYzD0Wjh1g1GnrVoMDGsJS7bcC3zrGy72chm8UxMa9HrYzoNN7PhyLdFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssm-udhPTxrBY7pYbm2U0cU0Ws8HKthg5TMPlyDbcd1wj43A0Wrh1g5FnLRpMDGuJyzZcyzwr2242slk8E9Na9PqYTsPNbDjy7Rur2XKz2O0Wy31jNVtuFrvdYrnv0Bm-q8_ZqLxpFR6VLfNZib0yp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjcO4GI1MHpdvY1uYRibDYrHZbFbDmcM5mThWE4tYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&tst=1&docw=0
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=1AE97D881841987170235317255&cicmp=1657475&cijs=1&dast=V7TRoCFgPOKGtV09RuTATOKGtV09RuTAUAAAAGBvQHHLFgMXcj4nAxHC2Ww91itlwMVsvRbDcZbqYQYiyXyaAWSFhmv--goJyeHrPLIGO5TAa1QNY0ufxu-ELT6fC57vW63--uc_ocdpHLr3tZHIbD5y94OA8Ps1_0NBw-f8HDeXiY3WK_z2l3a_5uncto-rxVd5Nb83eL_S7P6a00Wt5iv89pdwsuf4vZ5Xb55QAAAADwAKBU2A_xAwgAEAEAAAAgAQAAAEARUPFvIXABAAAAgAFQgPWjAQDFwXCuu_VlNzpcn5fdHwAADwEgAAADCiQAAzhNJQAVOQcnAAAAAAAAAAAs_____zEAesRnMgAZSoM3Bj0ADz4AD0IAAABZQxkCqOTQX6C5RAWIRYwAAAAAIJnaPI4mdUJlUQUAQJBuBXAFABDQJgYaAZalOyjxFgYAAEAwtkAPi99vdtg1frfLAAAAAAAAAADM_s_-0YSIxtzSglgKeNV-AQEA1n4BAQDY1A0A4C0ALugIWjEYrM4gJpvRbjI7AAAAgLv___9_PZBc7SamjWGx3C03Nsto4posZoOVbTFymIbLkW24vTkKSNfokpCHvhFhmf2-g4JyenrMLoOM5TIZ1AJZ0-TyG8QHDcNyMgjmN2GL0Woy2SyHs-ViMhiOhqPR_gRuNMAJGg4Hi91gsVsshpPFZDRYDhYoEIMJTshwtJmsRrvVbrIcTkaj2WayQYpWrWajzWC4mk1mu91qOBguRyOkaM1iNpksZqPlbjNYTkaD4WQ4RJhxjYzD0Wjh1g1GnrVoMDGsJS7bcC3zrGy72chm8UxMa9HrYzoNN7PhyLdFwQClvQgu0onmdPm7XJa35m1x65w-h0Us0Zws0onssm-udhPTxrBY7pYbm2U0cU0Ws8HKthg5TMPlyDbcd1wj43A0Wrh1g5FnLRpMDGuJyzZcyzwr2242slk8E9Na9PqYTsPNbDjy7Rur2XKz2O0Wy31jNVtuFrvdYrnv0Bm-q8_ZqLxpFR6VLfNZib0yp0HhMli8P4lpMe3ODp7f7-hUqS4aY0P2TSjMBo_BoIglgtNFOhG9jKeLWCJ5WqQTjcO4GI1MHpdvY1uYRibDYrHZbFbDmcM5mThWE4tYojRdpBO97mVxGA6fv-DhPDzMftHTcPj8BQ_n4WF2i_0-p92t-bt1LqPp81bdTW7N3y32uzynt9JoeYv9PqfdLbj8LWaX22VR_7EhRqO5bjZXDJZzzWCVAAAAAAAAAACWMGfeBAAAAOA0kMViMFksFwBCjHWX4FMq5NEJ_K248WOIOV3-LpflrXlb3Dqnz2FlAImdAg!&excid=22&tst=1&docw=0
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
t_gid=c5d8844a-70d3-40b0-be68-f3e676dfb3b4-tuct48368d7
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.13.12
content-type
text/html;charset=ISO-8859-1
accept-ranges
bytes
date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 varnish
x-served-by
cache-fra19124-FRA
x-cache
MISS
x-cache-hits
0
x-timer
S1569317721.516077,VS0,VE10
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/23_14_1/infra/
762 KB
179 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_1/infra/cmTagFEED_MANAGER.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f1a50e7c8a1e222f164f802e726bb855301f3e7af5b93760b64d907a65ccee37

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 999a435eb37a050d3de26fe63534c416.cloudfront.net (CloudFront), 1.1 varnish
age
157484
x-amz-meta-mtime
1569154214
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1569154246
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
182958
x-served-by
cache-fra19143-FRA
last-modified
Sun, 22 Sep 2019 12:10:48 GMT
server
AmazonS3
x-timer
S1569317721.514899,VS0,VE0
etag
"a88af490dada7450be822c703291cfc3"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
WlInkYy4WnBI38g343KvNhFwO7afrB-EdlWbg8rAN1QJ-7Rf7_LYfg==
x-cache-hits
154462
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_1/assets/css/
34 KB
6 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_14_1/assets/css/cmOsUnit.css
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
via
1.1 8cdf0467c0468ddfe8e9873c6bb8304c.cloudfront.net (CloudFront), 1.1 varnish
age
162569
x-amz-meta-mtime
1569154212
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1569154225
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
6240
x-served-by
cache-fra19143-FRA
last-modified
Sun, 22 Sep 2019 12:10:27 GMT
server
AmazonS3
x-timer
S1569317721.515029,VS0,VE0
etag
"1112e8ccb1e3ed0d2e59d31564a5dfae"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
0kHjSgwhcUPI4c0QFQ3ufXp7-BgMErqTKbxuNNJliDLMPboc-1cvMA==
x-cache-hits
257296
vast
tracking.m6r.eu/sync/ Frame 0120
490 B
926 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3D12535787fd%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D8ccb60e2-b44d-4596-bf4d-7717f2998fa0
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
cd8940c4c63a95072326d6d5f3c996384d0f31874a1541e057b43272bcf29bd5

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
nginx
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/xml; charset=utf-8
Content-Length
490
getAd
video-adserver.ibillboard.com/ Frame 0120
48 B
567 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=12535787fd&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=8ccb60e2-b44d-4596-bf4d-7717f2998fa0
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
48
Expires
Tue, 01 Jan 1991 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 3CAB
0
61 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsutOhOO_SYpLDmwx9NIeKSX8euhdD0k6E9YcXS2ZJixGySfJhxUSVaWN8jpj9dFZ8KgP4UzcTufcosXPRwZlaty7FrH8kfP9KdATfIUcrhBWZnTaDyl1wWlONiQjpc0_XroAbM7xhBUfuLTE3Ki1DksLMnX4J3_wipn8EzmRB7O_fykbmB98vrbNb7SfJEEoBGSXnWoYJMX9bMn2NVN1qzS38T1Sn3V9CF8Z0NgPw3V7xtnLPn7tEgfYthqj6IuMOziC3GP9F94rWnHipLcHg2vsjzyRAC73w3oroCkHgDr&sig=Cg0ArKJSzPMcMIjZclzDEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:20 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,43,39"
content-length
0
x-xss-protection
0
mtrcs_220434.js
s79.research.de.com/bb-mx/prime/ Frame 3CAB
2 KB
1 KB
Script
General
Full URL
https://s79.research.de.com/bb-mx/prime/mtrcs_220434.js?pjid=220434&adc=4633102&cpid=23195172&site=1405936&place=255206606&cid=97096287&size=1800x1000&cb=565299410
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.84.39 Munich, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h550.meetrics.de
Software
nginx /
Resource Hash
30b3bf0c9ec03ceeee2b7ac374a183250de077afd73ec6357519445870ebe158

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Content-Encoding
gzip
Server
nginx
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1039
Expires
Tue, 24 Sep 2019 09:35:19 GMT
smb-brand-booster-desktop.js
media.gamona.de/dfp/
13 KB
5 KB
Script
General
Full URL
https://media.gamona.de/dfp/smb-brand-booster-desktop.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
82.149.242.40 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.6.2 /
Resource Hash
53c3adf0fadb97ff92b3a406693bb9ec4630b9b0d650ec5437383550380dc875

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Content-Encoding
gzip
Last-Modified
Thu, 08 Aug 2019 09:12:46 GMT
Server
nginx/1.6.2
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=300
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Tue, 24 Sep 2019 09:40:20 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3CAB
78 KB
29 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
29692
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:20 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 04E6
0
61 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssbKftPp18uop-TDrnnCorikDh7QOXjBZ8JbPNvzNNsWOiH8Kuvv4TII9-XSfv9YERt66p1P7SIrnesWIG2AOpHA7U8GzAalVbDYx2sx7IEh2kAyQP0cuVT6D5dyyF5NjwoXb7AVOShr2uAMavFgysIEPjQaXikikZC92ylAAx1R5WsD9CsxZlZv9XAjApHuN_HbCZKjh3TNXuZKurB_aQTVsqCmN08cV-zE0IcbM8lZU_l5x8Vv4FKS7S3TVztHKxkR_IS4qY4naUlsUa9GkMgOtmk67ejHHfP95aHy5um&sig=Cg0ArKJSzHfDWQ9uPWI-EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:20 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,43,39"
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 04E6
78 KB
29 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
29692
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:20 GMT
mtrcs_220434.js
s79.mxcdn.net/bb-mx/serve/ Frame 3CAB
118 KB
46 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Requested by
Host: s79.research.de.com
URL: https://s79.research.de.com/bb-mx/prime/mtrcs_220434.js?pjid=220434&adc=4633102&cpid=23195172&site=1405936&place=255206606&cid=97096287&size=1800x1000&cb=565299410
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
0b151fb8a946c68d94b2eff57a704c74251bfc4ca45b7c6a97e5547177126316

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 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=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
46494
Expires
Tue, 24 Sep 2019 10:05:20 GMT
index.html
media.gamona.de/assets/dragon_quest_xi/brand-booster/ Frame FF79
0
0
Document
General
Full URL
https://media.gamona.de/assets/dragon_quest_xi/brand-booster/index.html
Requested by
Host: media.gamona.de
URL: https://media.gamona.de/dfp/smb-brand-booster-desktop.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
82.149.242.40 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.6.2 /
Resource Hash

Request headers

Host
media.gamona.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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx/1.6.2
Date
Tue, 24 Sep 2019 09:35:20 GMT
Content-Type
text/html
Last-Modified
Thu, 19 Sep 2019 09:04:47 GMT
Transfer-Encoding
chunked
Connection
keep-alive
Vary
Accept-Encoding
Content-Encoding
gzip
B23195172.255206606;dc_pre=CKibooqU6eQCFUE74AodCxkMqg;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/
Redirect Chain
  • https://ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/B23195172.255206606;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
  • https://ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/B23195172.255206606;dc_pre=CKibooqU6eQCFUE74AodCxkMqg;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag...
42 B
120 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/B23195172.255206606;dc_pre=CKibooqU6eQCFUE74AodCxkMqg;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.21.198 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f198.1e100.net
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
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
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
x-content-type-options
nosniff
server
cafe
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
content-type
text/html; charset=UTF-8
location
https://ad.doubleclick.net/ddm/trackimp/N4022.280586.STROER-NETWORK/B23195172.255206606;dc_pre=CKibooqU6eQCFUE74AodCxkMqg;dc_trk_aid=451464474;dc_trk_cid=97096287;ord=565299410;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
cache-control
no-cache, must-revalidate
follow-only-when-prerender-shown
1
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
mtrcs_220434.js
s79.mxcdn.net/bb-mx/serve/
118 KB
46 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
0b151fb8a946c68d94b2eff57a704c74251bfc4ca45b7c6a97e5547177126316

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 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=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
46494
Expires
Tue, 24 Sep 2019 10:05:20 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=13&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm76=1&z=22336550
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767538
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1639303930&t=event&ni=1&_s=14&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=2028231348.1569317719&tid=UA-204785-4&_gid=1680995114.1569317719&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm76=1&z=1264535898
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::200e 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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Sep 2019 22:36:22 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1767538
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/e58qD0QAAKktFLkqFFlqwF23A52AwwA/k0FEEmvFytFh0FjvFklF9CEyhFukFCvFvzF0lFymBhkF29By4Ay2A52A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA30Az4AwyA23AmjEpkF9xAz4Ay4A30Ax4A44A4mAzpF6lF93Ay4A45BwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA30Az4AwyA23AmhEwkF91Ax3A0zA4wAy2A3mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A5zAx3A3yAw3AxyALlnFBTkzFePxQAAAAAAAB/uxAPCAAFAA/uxT55gASksFMEjAAAAAAAAAAAAEAAA/uxAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA43A0xA44A44AGAkpFylFj0FAAAAIAy4Ay2A52A11AKA1xA30Az4AwyA23AGAihFuuFlyFKA1xA30Az4AwyA23AKA1xA30Az4AwyA23AwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFQtjFvW7jTA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:19 GMT
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/e58qE0QAATkzFASksFVcdAAAgBAxYAQRAFAAA55gAAAQSo0F0wFz6BvvAtlFkpFhuBnhFtvFuhFukElvBhzFzlF0zFvkEyhFnvFufFx1FlzF0fF4pFviEyhFukFtiEvvFz0FlyFvpEukFl4FuoE0tFsjBo0F0wFzlBzBElyAGlByGEhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0lByGEwjFzlByGEjsFpjFrlBy1Ay1AzGE4hFplBy1Ay1AzEEBLFBPFqzF2fFi1F5RFymE4xAMZFmQFVWFipFEJFSKFW3F3tAjlFHNFU1FwwFmXF1QEnOFXMFnwF2OEH6F33BYyFO3FhWFyyFaRFuEFzUFU3FWYF1IFJZFnuFazBu5BwxFK5FGlFiPFlmF5UEkwBwNFikFVCFn0FxyFOOFJ3BwfF5KFz0ADoF51AMOFHQFEyBzOFG5Fq3BYSFQ3B1zEtwAnmFIlFZSFY3FMJFYvF1SE4JEKIFzVFRIFL3BsaFkaFmhFyiFn0F3jFI3BUyBmfFwlEVlFWxF6NFwzE6qF24EONFfMFkGFR0F5IFMzBtKE4sEzwFSiFKEFLqFuRFyxAYlF1OE0vEBHFzBE3sEopFWlFSTFxOEyuF6UF5tBVLFS3FE1FxhEzXE4MFzxFRfFR1F6tFK4BmvFKRFlyA1yA1yA2zEpnFlyA1yA1zAEDFnwBByFLKFT6FJpFh0BMXFJWFo3B6FFBFFlyA1yA1yA21EysFmpF4lBy1Ay1AzEExlAy1Ay1Ay2AhkF1yFslBy1Ay1AzEEo0F0wFzlBzBElyAGlByGEhkFukEv1FisFljFspFjrFuuEl0FlyAGkFktFlyAG0FyhFjrFjsFrlByGEO0BwyAyuAy4Aw1A42AuTEUSFPFFStBOFFUXFPSFLlByGECyBzxA51Ax3AyuAy1A1yAw2A2wA2lAzCEkjFf0FyrFfhFpkFlzAE0B1xA02A00A30AlzACkFjfF0yFrfFjpFklBzEE53Aw5A2yA43AlzACkFjfFshF0lBzEElzACkFjfFykFpkFlzAElBzCE0hFnfFmvFyfFjoFpsFkfFkpFylFj0FlkFf0FylFh0FtlFu0FlzAElBzCE0mF1hFlzAEjBjoE00FwzFlzABlByGElyAGhFkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FlyAGwFjzFlyAGjFspFjrFlyA1yA1zAG4FhpFlyA1yA1zAEBFLBFPqFz2FfiF15FRyBm4BxMEZmFQVFWiFpEFJSFKWF33BtjElHFNUF1wFwmFX1BQnFOXFMnFw2BOHF63F3YEyOF3hFWyFyaFRuFEzFUUF3WFY1FIJFZnFuaFzuE5wExKF5GFliFPlFm5BUkFwwENiFkVFCnF0xFyOFOJF3wEf5FKzB0DEo5B1MEOHFQEFyzEOGF5qF3YESQF31AztBwnEmIFlZFSYF3MFJYFv1BS4BJKFIzFVRFILF3sEakFamFhyFinF03FjIF3UEymEfwBlVFlWFx6FNwBz6Fq2B4OFNfFMkFGRF05FIMFztAK4BszFwSFiKFELFquFRyBxYEl1BO0BvBFHzBB3BsoFpWFlSFTxBOyFu6FU5FtVELSF3EF1xBhzBX4FMzFxRFfRF16FtKF4mEvKFRlBy1Ay1Ay2AzpFnlBy1Ay1AzEEDnFwBEyLFKTF6JFphF0MEXJFWoF36EFBFFlBy1Ay1Ay2A1yFsmFp4FlyA1yA1zAExBlyA1yA1yA2hEk1FysFlyA1yA1zAEjBjwAjjAwjAjwAjjAwjAjwAMACyFhuFkCFvvFz0FlyFAAAAAAAAAAAAAAAAQtjFLldkaA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:19 GMT
truncated
/ Frame 3CAB
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b46c267d43ddeb9cacc7a21e156396e397da01ed724782c3e31c52ab702cda9e

Request headers

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

Response headers

Content-Type
image/png
gettag
s79.research.de.com/bb-mxad/
0
294 B
Script
General
Full URL
https://s79.research.de.com/bb-mxad/gettag
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
148.251.84.39 Munich, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h550.meetrics.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Cache-control
private,must-revalidate
Server
nginx
Connection
keep-alive
Content-Type
text/javascript
Content-Length
0
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
submit
dc546.s79.research.de.com/bb-mx/
43 B
291 B
Image
General
Full URL
https://dc546.s79.research.de.com/bb-mx/submit?/d9yfB2AAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA5tAyzAtxA46Az5AtyAywA0zA0tAyuAxxAwtAz3A13A1wA4hELlnFByqhFx1A25AzxA33AywA20A1yAywA0zA0BE/k0FtBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAzxA51Ax3AymAzpF0lF9xA0wA15Az2AmwEshFjlF9yA11AywA22Aw2AmjEpkF95A3wA52Ay4A3mAzpF6lF9xA4wAw4ExwAwwAmjEi9B12A1yA55A0xAwBEMquFLBL2wFBLl1FC/2xFXCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgB3pFukFv3FftFznFgjEzzFf3FliFrpF0BFUkzFZBFAAAAAAAZwSLuBPAAAAAAAAAOAAAAGBAAAAAAZwSLuBBPBAAAAAAAABKmWAPAAAFAAKmWTGWjAPBAAAAAAAAPGWjASksFEEbAAAAAAAAAAAAEAAAKmWAAAAAAAIAyzAx5A1xA3yAJAy1A1yAw2A2wA2BEHAx0Aw1A5zA2BEJAx4AwwA4xBwwAwBEIA53Aw5A2yA43AHA02AzzAxwAyBEdAAAAAAAZAwSAFAAAGWjAAAJAohFipFssFhnFlBFEATLFJOFAAAAAAAAAAAAAAAAd/EAyEAUHA8AAAAAA1eRAAAPAOPFfTFPVFSDFFfFz4A21AyBECACBFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFNf/0UA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.110.202 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h546.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Tue, 24 Sep 2019 09:35:19 GMT
zVw
tracker-adserver.ibillboard.com/error/impid/8ccb60e2-b44d-4596-bf4d-7717f2998fa0/iid/1e959c1a-ef70-4d5c-9ca8-793e10022ca5/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2... Frame 0120
0
272 B
Image
General
Full URL
https://tracker-adserver.ibillboard.com/error/impid/8ccb60e2-b44d-4596-bf4d-7717f2998fa0/iid/1e959c1a-ef70-4d5c-9ca8-793e10022ca5/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/zVw?erc=303
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*, *
Date
Tue, 24 Sep 2019 09:35:20 GMT
Access-Control-Allow-Credentials
true
Server
ibillboard
Connection
keep-alive
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET
tag
a.teads.tv/page/68592/ Frame 0120
1 KB
827 B
Script
General
Full URL
https://a.teads.tv/page/68592/tag
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.21.37.179 , France, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-21-37-179.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
551
expires
Tue, 24 Sep 2019 10:35:20 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
712 KB
186 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.21.37.179 , France, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-21-37-179.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
38b0293b25c51a1c571a710b02ef7ecb64701c212e8f1eaf131d436dec980a8f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
last-modified
Wed, 18 Sep 2019 14:08:00 GMT
x-amz-request-id
CDB7F3C0EAEB2C6E
etag
"c9baa4325cc6e135d83d2db2de46cb23"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
a
accept-ranges
bytes
content-length
189686
x-amz-id-2
QwYjD//uFUKVW6p1zo+WSq8NUcRgW1djtcWWV9S4vSyURcKFND/7ffB/nDiAFUfMZVoZB93ICj0=
expires
Tue, 24 Sep 2019 09:45:20 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame 5814
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Tue, 24 Sep 2019 09:40:20 GMT
Date
Tue, 24 Sep 2019 09:35:20 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame 3328
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Tue, 24 Sep 2019 09:40:20 GMT
Date
Tue, 24 Sep 2019 09:35:20 GMT
Connection
keep-alive
p
sb.scorecardresearch.com/
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569317720881&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=26473127&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1569317720879&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
cache-control
max-age=0, no-cache, no-store
expires
Tue, 24 Sep 2019 09:35:20 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1569317720879&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
cache-control
max-age=0, no-cache, no-store
expires
Tue, 24 Sep 2019 09:35:20 GMT
content-length
23
content-type
image/gif
p
sb.scorecardresearch.com/
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569317720896&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=98512294&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.19.43.224 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-19-43-224.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:20 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Expires
Mon, 01 Jan 1990 00:00:00 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1569317720895&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
cache-control
max-age=0, no-cache, no-store
expires
Tue, 24 Sep 2019 09:35:20 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1569317720895&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
cache-control
max-age=0, no-cache, no-store
expires
Tue, 24 Sep 2019 09:35:20 GMT
content-length
23
content-type
image/gif
view
securepubads.g.doubleclick.net/pcs/ Frame 0BD0
0
62 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvsK2cPdD9DYhZTfrl8vxKzLzVSRHfETghXGt4XFk6g7l1XvQr_aDO8LlK0AC--UJ9C6_3WsU4tOSD_mq3Hd9jlxFAPjaD6rgKiNwOq-f_MRWSGoX2CAvfCpJzqL_TON7n1DTnBJafaynqIHW2jLK2rN8l2rgOmVS2alScBYteEc5el1iEZus96DuXEGaIE9YtDncxTxQkIg8FOJ1S2jQ7oQL4bwjINcJoMa48-lVDYnZRqOBgl_KDagIVWXsEtlGERGUxZuHkGX8mkeNM3MnKhIyq00j1J6N0T7Dex&sig=Cg0ArKJSzHiA5wexGWDiEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:20 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,43,39"
content-length
0
x-xss-protection
0
vpt.js
static.cliipa.com/basev/ Frame 0BD0
38 KB
11 KB
Script
General
Full URL
https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel&macros[regs_gdpr]=1&macros[user_consent]=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
69.16.175.42 Phoenix, United States, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
tlb.hwcdn.net
Software
/
Resource Hash
be701739dbd531e7a05df6dea81b4666d177b2ef14503eba47e7bf220959788d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:20 GMT
Content-Encoding
gzip
Last-Modified
Wed, 07 Aug 2019 15:09:39 GMT
ETag
"1565190579"
Access-Control-Allow-Methods
GET, OPTIONS, HEAD
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Origin, Accept ,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Length, Accept-Language, Accept-Encoding, Referer, Range
Cache-Control
max-age=37689
Connection
Keep-Alive
Accept-Ranges
bytes
Content-Type
application/javascript
Access-Control-Allow-Headers
Origin, Accept ,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Length, Accept-Language, Accept-Encoding, Referer, Range
Content-Length
9883
X-HW
1569317720.dop001.fr8.t,1569317720.cds099.fr8.shn,1569317720.cds099.fr8.c
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0BD0
78 KB
29 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_2019091901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
29692
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:20 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=0f9d255f-df62-40c7-87d7-8c1c6406f3e9&formatVersion=2.22.61&env=js-web&netBw=9.5&ttfb=98
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.21.37.179 , France, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-21-37-179.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Tue, 24 Sep 2019 09:35:20 GMT
ad
a.teads.tv/page/68592/
118 B
332 B
XHR
General
Full URL
https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=0f9d255f-df62-40c7-87d7-8c1c6406f3e9&formatVersion=2.22.61&env=js-web&netBw=9.5&ttfb=98
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.21.37.179 , France, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-21-37-179.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:20 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Tue, 24 Sep 2019 09:35:20 GMT
extend
bis.cliipa.com/event/ Frame 0BD0
0
438 B
XHR
General
Full URL
https://bis.cliipa.com/event/extend
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel&macros[regs_gdpr]=1&macros[user_consent]=2
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.235.243.56 Ashburn, United States, ASN14618 (AMAZON-AES - Amazon.com, Inc., US),
Reverse DNS
ec2-54-235-243-56.compute-1.amazonaws.com
Software
Cowboy /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/json; charset=UTF-8

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Via
1.1 vegur
Server
Cowboy
P3p
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Access-Control-Allow-Origin
*
Connection
keep-alive
Access-Control-Allow-Headers
Origin, DNT, X-Requested-With, Keep-Alive, Content-Type, Accept, Cache-Control, Pragma, Authorization, Content-Length, Accept-Encoding, Accept-Language
Content-Length
0
json
server.cliipa.com/campaigns/551424a21b1b1f08006fb6f9/5c9117581325370004630210/ Frame 0BD0
5 KB
3 KB
XHR
General
Full URL
https://server.cliipa.com/campaigns/551424a21b1b1f08006fb6f9/5c9117581325370004630210/json?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ref=www.giga.de&st=true&cb=1569317720969
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel&macros[regs_gdpr]=1&macros[user_consent]=2
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.235.243.56 Ashburn, United States, ASN14618 (AMAZON-AES - Amazon.com, Inc., US),
Reverse DNS
ec2-54-235-243-56.compute-1.amazonaws.com
Software
Cowboy /
Resource Hash
6716ffc730601787bc2fe3c9aaa5761ff6c3348411c8744f8f2fabb6bea0408c

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/json; charset=UTF-8

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Content-Encoding
gzip
Server
Cowboy
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept, Authorization, Content-Range, Cache-Control
Content-Length
2799
Via
1.1 vegur
truncated
/ Frame 0BD0
208 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
f4189fdfd0fa2ff7bd77fee56e4876e4671e85244d1b183e9788f97a21cf0329

Request headers

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

Response headers

Content-Type
image/png
iframe
sync.teads.tv/ Frame 9FF0
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=73584&userId=0f9d255f-df62-40c7-87d7-8c1c6406f3e9&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569317720987
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.5 /
Resource Hash

Request headers

:method
GET
:authority
sync.teads.tv
:scheme
https
:path
/iframe?pid=73584&userId=0f9d255f-df62-40c7-87d7-8c1c6406f3e9&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569317720987
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=ab8dc8d7-2d42-4996-a772-5f53aaeff32b
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
content-length
1844
expires
Tue, 24 Sep 2019 09:35:21 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:21 GMT
set-cookie
tt_exelate=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Wed, 25 Sep 2019 09:35:21 GMT; Domain=.teads.tv; SameSite=None
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=adCall&ts=1569317720880&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=22&gdpr_consent=[gdpr_consent]&gdpr_reason=220&fv=101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:21 GMT
cache-control
max-age=0, no-cache, no-store
expires
Tue, 24 Sep 2019 09:35:21 GMT
content-length
23
content-type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=noAd-ivt-doubleVerify&ts=1569317720880&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.7 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-7.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 24 Sep 2019 09:35:21 GMT
cache-control
max-age=0, no-cache, no-store
expires
Tue, 24 Sep 2019 09:35:21 GMT
content-length
23
content-type
image/gif
data
dc546.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc546.s79.research.de.com/data?/d9yfCYHAALktFBLkqFFlqwFyyAw0Az0ATkzFeP5DAIAAAAAdOxYAPSDAAAAAAAz1eRASksFRYdJPAKCAsEA6DAAAAAOxYAAAQAOPFfTFPVFSDFFfFyxA5zA51ACANSFAAAAAAAAAAAAAAGAJGFSBFNFFd/EAyEAUHA8AAAAAAj9pAAAxOo0F0wFz6BvvAnvFvnFslFhkFzuBnuBkvF1iFslFjsFpjFruBulF0vBwhFnlFhkFvhEkzF/jEspFluF09BjhFtwE1iFtzA5zA54AxzAy4A3wAzwAw4A0mAv1F0wF10F9oE0tFsmBo9B2wAmzEsvF0uFhtFl9Bz4A31Aw2A05A13AmhEkrF9yAyxAwzA00A2wA4mAhkFm9BxzAwxA22AxyA3wAm3E90A24AmsEt0F9xA12A5zAx3A3xA5mAn1FjpF9xAuyAuwAuwAuyAuyAuwAuwAmmEvyFthF09B02A44E2wAm1EysF9oE00FwzFlzABlByGElyAG3F33FunEpnFhuBklFlyAG3FliFhwFwzFlyAGwFh5FwhFslByGE0pFwwFzlByGEwhF5wFhsFtsEvnFpuFtzEvtBnlFo0FztB1uFktBzvFtsEvlFz0FtpEoyFtsEvnFpuFtwEyvFisFltFllByGEmmEshFzoF9wAm3EnsF9xAmhEkzFpkF9OEUmBk0F9xA12A5zAx3A3xA50A40AmiEwwF9xAxmAikF09BxzA4mAmkF09BxxA2mApkF09BxxA2mAzoF29ByyBwxA5wA5xA4mAjiF29ByyBwxA5wAxzAxmAzhFskFy9BhhFmhEi4Fl9BxmAjvFyyFlsFh0FvyF93A13A05A2xA1xA32Az0AmmEytF9yAwmAw2F9yAmnEhfF2pFk9BywAy4AyzAxzA04AuxA12A5zAx3A3xA5mAnhFfzFpkF9xA12A5zAx3A3yAwmAnhFfoFpkF9xA2zA5zAwzA5zAwmAnhFfmFj9BwmAphFn9BwmApjFznF94Ax2AzxA30AzyAmkEzzF69B12AmtEkvF9wAmtEzvF9wAm1Ef0F69BxyAwmA1fFopFz9BymA1fFqhF2hF9wAm1EfoF9xAywAwmA1fF39Bx2AwwAm1EfhFo9BxyAwwAm1EfhF39Bx2AwwAm1EfjFk9By0Am1EfuFwsF1nF9wAm1EfuFtpFtlF9wAmhEk4F9zAx4AmhEk5F90A02AmiEp3F9xA14A1mAipFo9BxyAwwAmzEjyFf4F9wAmzEjyFf5F9wAmlEpkF9yAxwA20A1wA1mAvpFk9BzmAy4F9wAmlEhlF9wAmmEj9B5xAymAiyFkpFt9BwlAyDEwlAyDEwlAyDEwlAyDEx2AwwAlyADwBlyADxB2wAwlAyDExyAwwAlyADxB2wAwlAyDExyAwwAm2EpzF9xAmyEz6F9lA3DEl3ADlFFlB3DEmhEisF9DETmBwmF49BwmAm1F9xA2mAijF9zAxmApmFp9BxmA1jFp9BxuAupFyqFm3FyxB3mF16FmmEziF9xAm4EwjF9JEHUFNhFE2Br2BimBw9Bo0F0wFzlBzBEvvA33F3uBnpFnhFukElmBk0Fk9BxyA4BECACBFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFA2E7YA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.110.202 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h546.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:21 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:20 GMT
data
dc546.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc546.s79.research.de.com/data?/d9yfDZHAAyqhFx1A25AzxA33AywA20A1yAywA0zA0BE/k0FtBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAzxA51Ax3AymAzpF0lF9xA0wA15Az2AmwEshFjlF9yA11AywA22Aw2AmjEpkF95A3wA52Ay4A3mAzpF6lF9xA4wAw4ExwAwwAmjEi9B12A1yA55A0xAwBElqwFyyAw0Az0ALkmFBTkzFARksFAQtjFxNfWSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.110.202 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h546.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:21 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:20 GMT
5174380267
api.yieldlove-ad-serving.net/v1/bl/4444/
43 B
293 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5174380267
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.196.191.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-191-159.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
b5fa1ca5f3a828ddd08703cc68600688e03f71751a2ad0bbf5b33f94f22f5cac

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Tue, 24 Sep 2019 09:35:12 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/5174380267
Transfer-Encoding
chunked
Content-Type
application/json
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&n2=3&n3=1&n4=3&n5=3&n6=2&n7=1&n8=1&n9=3&n10=2&n11=1&n12=1&n17=4&n18=2&n20=2&n21=4&n22=4&n39=4&n43=4&n44=3&n46=4&n47=4&n48=4&n55=4&n57=4&n60=3&n67=1&n70=4&n71=1&n75=0&n76=1&n77=0&n78=0&n79=1&n80=0&n81=0&n82=0&n83=0&n84=0&n85=0&n86=0&n87=0&n88=1&n117=4&n118=3&n119=6&n120=2&n121=1&n122=1&n123=2&n127=0&n128=1&n133=1&n95=1&n96=1&n135=9&n15=1&n66=1&n89=1&n90=1&n91=1&n92=3&n93=4&n94=2&n97=1&n98=1&n101=1&n104=1&n106=1&n108=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n148=1&n149=1&n154=1&n155=1&n156=1&n158=1&n159=1&n161=1
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
57f344220821bc52a0bda077127249ca9c8862221fcfad53cd4e4aa5906852ac

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:21 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
1370
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=445b0eb73f158de8dbed42dc56d2b33c
43 B
859 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=445b0eb73f158de8dbed42dc56d2b33c
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.221 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
316.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:23 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.55:80
AN-X-Request-Uuid
9957db8f-208a-4685-a3d6-d46a02e1825c
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
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=445b0eb73f158de8dbed42dc56d2b33c
Date
Tue, 24 Sep 2019 09:35:21 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
98
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=RFsOtz8Vjejb7ULcVtKzPA
  • 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.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:21 GMT
server
HTTP server (unknown)
status
302
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"
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
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,43,39",quic=":443"; ma=2592000; v="46,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=445b0eb73f158de8dbed42dc56d2b33c
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=445b0eb73f158de8dbed42dc56d2b33c
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.122.151 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a2-16-122-151.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:21 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
Mon, 23 Sep 2019 09:35:21 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=445b0eb73f158de8dbed42dc56d2b33c
Date
Tue, 24 Sep 2019 09:35:21 GMT
Server
nginx
Connection
keep-alive
Content-Type
text/plain; charset=utf-8
Content-Length
99
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
sbt.js
static.cliipa.com/basev/1.0.310/ Frame 0BD0
518 KB
116 KB
Script
General
Full URL
https://static.cliipa.com/basev/1.0.310/sbt.js
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/vpt.js?userId=551424a21b1b1f08006fb6f9&containerId=5c9117581325370004630210&format=3&host=cliipa.com&query[coppa]=false&query[param1]=adunit_/4444/giga.de_sd/software_artikel&macros[regs_gdpr]=1&macros[user_consent]=2
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
69.16.175.42 Phoenix, United States, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
tlb.hwcdn.net
Software
/
Resource Hash
559b21249d6335756699745b380a34a3640802b3963c5a52a5e8dbed9bc4262a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Content-Encoding
gzip
Last-Modified
Wed, 18 Sep 2019 11:59:19 GMT
ETag
"1568807959"
Access-Control-Allow-Methods
GET, OPTIONS, HEAD
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Origin, Accept ,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Length, Accept-Language, Accept-Encoding, Referer, Range
Cache-Control
max-age=26858
Connection
Keep-Alive
Accept-Ranges
bytes
Content-Type
application/javascript
Access-Control-Allow-Headers
Origin, Accept ,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Length, Accept-Language, Accept-Encoding, Referer, Range
Content-Length
117510
X-HW
1569317720.dop001.fr8.t,1569317721.cds099.fr8.shn,1569317721.dop001.fr8.t,1569317721.cds105.fr8.c
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.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:21 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
95b6152e-011e-45d2-81fc-a3a85994f718
https://www.giga.de/ Frame 0BD0
1 KB
0
Other
General
Full URL
blob:https://www.giga.de/95b6152e-011e-45d2-81fc-a3a85994f718
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/1.0.310/sbt.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ee441245ef85f538030acf5e534d1cf2664c18289cec8cc0d84656ffb0e0a95d

Request headers

Sec-Fetch-Mode
same-origin
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Length
1205
76704056-0b34-4796-8a43-e507307a26dc
https://www.giga.de/ Frame 0BD0
1 KB
0
Other
General
Full URL
blob:https://www.giga.de/76704056-0b34-4796-8a43-e507307a26dc
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/1.0.310/sbt.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8e920612ce29a3290fc2edbaab7647470f21dda35cc1a350f9b8b362fc4d3ebe

Request headers

Sec-Fetch-Mode
same-origin
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Length
1515
truncated
/ Frame 0BD0
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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
truncated
/ Frame 0BD0
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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
gpt.js
www.googletagservices.com/tag/js/ Frame B85D
39 KB
12 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/1.0.310/sbt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
57bc7032c0d434b5823f3b8bb57f1fd0996873271ea168c4df9cb1fd918b1d96
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"288 / 652 of 1000 / last-modified: 1569254786"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
12638
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:21 GMT
5a68ceacaf6e230004eddda8.mp4
inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a68ceacaf6e230004eddda8/ Frame 0BD0
0
0

pubads_impl_2019091201.js
securepubads.g.doubleclick.net/gpt/ Frame B85D
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.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.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
511c23178d504d371d22fb6899174f448db32523e9cacd2860306a2b3b8cc1f5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 12 Sep 2019 13:06:13 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,43,39"
content-length
58953
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:21 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame B85D
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.giga.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:806::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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 24 Sep 2019 09:35:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
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"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
108
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/ Frame B85D
19 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=551736981558209&correlator=1093145991158589&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062453%2C21064569&vrg=2019091201&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190924&iu=%2F5286166%2Fgiga.de%2FVidazoo-Passback-300x250&sz=300x250&eri=6&cookie_enabled=1&cdm=www.giga.de&bc=31&abxe=1&lmt=1569317722&dt=1569317722006&dlt=1569317721896&idt=98&ea=0&frm=23&biw=1585&bih=1200&isw=300&ish=250&oid=3&adx=968&ady=637&adk=3503934010&uci=iau36quht1cl&ifi=1&ifk=2079463813&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=2&iag=15&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=2&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=1746043025.1569317722&ga_sid=1569317722&ga_hid=143656984&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
bcd30b8327058ae6bd203eb722b5f9efa10767558494ca0b9177300acaa480e2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:22 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
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
7716
x-xss-protection
0
google-lineitem-id
5021576057
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138266369035
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.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_2019091201.js
securepubads.g.doubleclick.net/gpt/ Frame B85D
62 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091201.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
7c92ffc225aed56f82019862b155c8d84902352620250d029bbf653a3d7eab61
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 12 Sep 2019 13:06:13 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,43,39"
content-length
24116
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:22 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame B85D
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

userconnect
ih.adscale.de/
546 B
928 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1569317722031&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
0b76290a2c34c33340895083a70110d2c6aa5027d638ea22bf741920bdc39b95

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:22 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
546
Expires
Tue, 24 Sep 2019 09:35:22 GMT
Cookie set map
ih.adscale.de/ Frame 5FD9
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
uu=7f20f7c4d5cf4e4682eee5e5e59f06b7; tu=4#21194471#48~7e3d8ee1b515093347ef82a5009dc890~435921~0~0; ng=2#2108873842#26155295#41728
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Tue, 24 Sep 2019 09:35:22 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:22 GMT
Content-Length
675
Connection
keep-alive
Set-Cookie
tu=4#3903254249#48~7e3d8ee1b515093347ef82a5009dc890~435921~0~0#101~~435921~435921~1#38~~435921~435921~1#39~~435921~435921~1#40~~435921~435921~1#72~~435921~435921~1#42~~435921~435921~1#75~~435921~435921~1#63~~435921~435921~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
nuggad
ih.adscale.de/ Frame 7A39
Redirect Chain
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F7f20f7c4d...
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/7f20f7c4d5cf4e4682eee5e5e59f06b7/ts/1569317722053/v/2/hid/407/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
49 B
490 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/7f20f7c4d5cf4e4682eee5e5e59f06b7/ts/1569317722053/v/2/hid/407/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

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

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:22 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Tue, 24 Sep 2019 09:35:22 GMT

Redirect headers

Date
Tue, 24 Sep 2019 09:35:22 GMT
Server
Apache
Status
302 Found
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Location
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/7f20f7c4d5cf4e4682eee5e5e59f06b7/ts/1569317722053/v/2/hid/407/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Cache-Control
no-store,no-cache
Transfer-Encoding
chunked
Connection
close
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 0BD0
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuqLI2Et5l2D1eUlCsblM3l4vKLrzJSQ9j7KVSCi5qbt3tBsuiRFgUfKZvDCf4bljIvcX9mMXzrPZnAT0qoCHby5GJTXUrPEi3fltqyxf0&sig=Cg0ArKJSzDiAJjpkm2KeEAE&adk=3179048887&tt=-1&bs=1585%2C1200&mtos=1098,1098,1098,1098,1098&tos=1098,0,0,0,0&p=138,968,388,1268&mcvt=1098&rs=3&ht=0&tfs=1310&tls=2408&mc=1&lte=1&bas=0&bac=0&met=no&avms=nio&niot_obs=1216&niot_cbk=1222&md=2&lm=2&rst=1569317720931&rpt=44&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1585%2C7758&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-35-23-13-139-21-0-0-0&tvt=2402&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:22 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 0B0E
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2001 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
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-35/html/container.html?n=2
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3491
date
Tue, 24 Sep 2019 05:45:21 GMT
expires
Wed, 23 Sep 2020 05:45:21 GMT
last-modified
Fri, 21 Jun 2019 14:35:26 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, immutable, max-age=31536000
age
13801
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
osd.js
www.googletagservices.com/activeview/js/current/ Frame B85D
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:22 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569237451959804"
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,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
29169
x-xss-protection
0
expires
Tue, 24 Sep 2019 09:35:22 GMT
5005878418
api.yieldlove-ad-serving.net/v1/bl/4444/
47 B
297 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5005878418
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.196.191.159 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-191-159.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e00a937cbb03d2021dda2bf5b1737208599260fe486b2729b96ee027b7d539c9

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Tue, 24 Sep 2019 09:35:13 GMT
Cache-control
public, max-age=604800
Connection
keep-alive
X-Key
/bl/4444/5005878418
Transfer-Encoding
chunked
Content-Type
application/json
hic_qos
ssl.1.damoh.giga.de/ Frame 19CF
24 B
409 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.247 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.247.115.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:24 GMT
Last-Modified
Wed, 24 Jul 2019 10:17:21 GMT
Server
openresty/1.15.8.2
ETag
"5d383031-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 3AA6
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0caf031a9d7aafe97f87fba3be0ebe861e187a75893da0bef95b1c2cadddf137

Request headers

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

Response headers

Content-Type
text/javascript
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
11 KB
11 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json
Requested by
Host: gocp.stroeermediabrands.de
URL: https://gocp.stroeermediabrands.de/trackcp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
16ba5d501cf510c0f7c702072334dbbe1babbb6cb9e17262db519c4e1659856a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Tue, 24 Sep 2019 09:35:23 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
content14_10_18m.js
vidstat.taboola.com/
37 KB
8 KB
Script
General
Full URL
https://vidstat.taboola.com/content14_10_18m.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 3ccfbae98f5816b531634c1e82e45259.cloudfront.net (CloudFront), 1.1 varnish
age
854888
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-fra19143-FRA
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1569317724.629670,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
Vs4TubaGEnCgigh3kN5-OJytJd-a8QzTxQCNFZg0hh5KVFK_O_tI7g==
x-cache-hits
1589713
oppsula.js
vidstat.taboola.com/oppsula/1.3.6/
15 KB
5 KB
Script
General
Full URL
https://vidstat.taboola.com/oppsula/1.3.6/oppsula.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 f96185b1d69d6f85635bc2b5554da639.cloudfront.net (CloudFront), 1.1 varnish
age
809851
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
5174
x-served-by
cache-fra19143-FRA
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1569317724.630358,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
uhaJsUkg4hXF1IiWZjxakv-aTXNBKcYYS7Jfn2_5QjDWGhm5qnKWew==
x-cache-hits
1363444
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/
676 KB
180 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/OvaMediaPlayer.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
e3cd4f1f8c496707beb1dd7a37c361bdf81deea0108a3ac762a88038c2a0982a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 5076c8187f430eebe5e26fc594d6125a.cloudfront.net (CloudFront), 1.1 varnish
age
669017
x-amz-meta-mtime
1568644056
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
184086
x-served-by
cache-fra19143-FRA
last-modified
Mon, 16 Sep 2019 14:27:38 GMT
server
AmazonS3
x-timer
S1569317724.647819,VS0,VE0
etag
"9be5ce4ea4d2b31a618aea49fc3a5569"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
6rl19C-yUwIKilOKsZv-eS2T8Cy_fDeYJHtGz2IV1Y03Bf448Y6ybA==
x-cache-hits
1135824
st
convammp.taboola.com/
0
52 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V79JACFgPOKGtV09RuTATOKGtV09RuTAUAAAAGBvQHG7FgMXcj4nAxHC2Ww91iN5hsVpvFbrJaDYEjFizmbkQcLoajxXK4W8yWi8FqOZrtJsPNFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAoDgYznW3vuxGh-vzsvsDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENpsAfgwQfggagAsYgRAAAAACRTm8fRpE6oLKoAAAjSrQCuAAAC2sRAI8DCAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-aENGYW1oQSwGv2i8gAMDaLyAAAJu6AQC8BcAFHUErBoPVGcRkM9pNZgcAAABw9____68HkqvdxLQxLJa75cZmGU1ck8VssLItRg7TcDmyDbc3RwHpGl0S8tA3Iiyz33dQUE5Pj9llkLFcJoNaIGuaXH6D-KBhWE4GwfwmbDFaTSab5XC2XEwGw9FwNNqfwI0GOEHD4WCxGyx2i8VwspiMBsvBAgViMMEJGY42k9Vot9pNlsPJaDTbTDZI0arVbLQZDFezyWy3Ww0Hw-VohBStWcwmk8VstNxtBsvJaDCcDIcIM66RcTgaLdy6wcizFg0mhrXEZRuuZZ6VbTcb2SyeiWkten1Mp-FmNhz5tigYoLQXwUU60Zwuf5fL8ta8LW6d0-ewiCWak0U6kV32zdVuYtoYFsvdcmOzjCauyWI2WNkWI4dpuBzZhvuOa2QcjkYLt24w8qxFg4lhLXHZhmuZZ2XbzUY2i2diWoteH9NpuJkNR759YzVbbha73WK5b6xmy81it1ss9x06w3f1ORuVN63Co7JlPiuxV-Y0KFwGi_cnMS2m3dnB8_sdnSrVRWNsyL4JhdngMRgUsURwukgnopfxdBFLJE-LdKJxGBejkcnj8m1sC9PIZFgsNpvNajhzOCcTx2piEUuUpot0ote9LA7D4fMXPJyHh9kvehoOn7_g4Tw8zG6x3-e0uzV_t85lNH3eqrvJrfm7xX6X5_RWGi1vsd_ntLsFl7_F7HK7LOo_NsRoNNfN5orBcq4ZrBIAAAAAAAAAwBLmzJsAAAAAnAayWAwmi-UCQIix7hJ8SoU8OoG_FTd-DDGny9_lsrw1b4tb5_Q5rAwgsVMA!&cmcv=&pix=31589837&cb=1569317723625&uv=23141&tms=1569317723625&abt=expl_vC!flrr3_vB!ufm_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1569317719224.756!ts:1569317723625&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317724.669511,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4038-HHN
st
convammp.taboola.com/
0
153 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V79JACFgPOKGtV09RuTATOKGtV09RuTAUAAAAGBvQHG7FgMXcj4nAxHC2Ww91iN5hsVpvFbrJaDYEjFizmbkQcLoajxXK4W8yWi8FqOZrtJsPNFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAoDgYznW3vuxGh-vzsvsDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENpsAfgwQfggagAsYgRAAAAACRTm8fRpE6oLKoAAAjSrQCuAAAC2sRAI8DCAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-aENGYW1oQSwGv2i8gAMDaLyAAAJu6AQC8BcAFHUErBoPVGcRkM9pNZgcAAABw9____68HkqvdxLQxLJa75cZmGU1ck8VssLItRg7TcDmyDbc3RwHpGl0S8tA3Iiyz33dQUE5Pj9llkLFcJoNaIGuaXH6D-KBhWE4GwfwmbDFaTSab5XC2XEwGw9FwNNqfwI0GOEHD4WCxGyx2i8VwspiMBsvBAgViMMEJGY42k9Vot9pNlsPJaDTbTDZI0arVbLQZDFezyWy3Ww0Hw-VohBStWcwmk8VstNxtBsvJaDCcDIcIM66RcTgaLdy6wcizFg0mhrXEZRuuZZ6VbTcb2SyeiWkten1Mp-FmNhz5tigYoLQXwUU60Zwuf5fL8ta8LW6d0-ewiCWak0U6kV32zdVuYtoYFsvdcmOzjCauyWI2WNkWI4dpuBzZhvuOa2QcjkYLt24w8qxFg4lhLXHZhmuZZ2XbzUY2i2diWoteH9NpuJkNR759YzVbbha73WK5b6xmy81it1ss9x06w3f1ORuVN63Co7JlPiuxV-Y0KFwGi_cnMS2m3dnB8_sdnSrVRWNsyL4JhdngMRgUsURwukgnopfxdBFLJE-LdKJxGBejkcnj8m1sC9PIZFgsNpvNajhzOCcTx2piEUuUpot0ote9LA7D4fMXPJyHh9kvehoOn7_g4Tw8zG6x3-e0uzV_t85lNH3eqrvJrfm7xX6X5_RWGi1vsd_ntLsFl7_F7HK7LOo_NsRoNNfN5orBcq4ZrBIAAAAAAAAAwBLmzJsAAAAAnAayWAwmi-UCQIix7hJ8SoU8OoG_FTd-DDGny9_lsrw1b4tb5_Q5rAwgsVMA!&cmcv=&pix=&cb=1569317723645&uv=23141&tms=1569317723645&abt=expl_vC!flrr3_vB!ufm_vA&ft=0&unm=FEED_MANAGER
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317724.669510,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4038-HHN
/
cx.atdmt.com/
Redirect Chain
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
  • https://cx.atdmt.com/?c=3296578555807784287&f=AYxZlHxKtYnd0RcZbsvDYbjRlZ7eUTf4seC7foWzmRrSA5nWXKWrcPqgf8k6iyxvUwqwY7xDbwIwGuuOx_9elMZ8&id=1773162896260346&l=3&v=0
42 B
405 B
Image
General
Full URL
https://cx.atdmt.com/?c=3296578555807784287&f=AYxZlHxKtYnd0RcZbsvDYbjRlZ7eUTf4seC7foWzmRrSA5nWXKWrcPqgf8k6iyxvUwqwY7xDbwIwGuuOx_9elMZ8&id=1773162896260346&l=3&v=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f02d:5:face:b00c:0:8c , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 24 Sep 2019 09:35:23 GMT
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC"

Redirect headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:23 GMT
server
proxygen-bolt
status
302
content-type
text/plain
location
https://cx.atdmt.com/?c=3296578555807784287&f=AYxZlHxKtYnd0RcZbsvDYbjRlZ7eUTf4seC7foWzmRrSA5nWXKWrcPqgf8k6iyxvUwqwY7xDbwIwGuuOx_9elMZ8&id=1773162896260346&l=3&v=0
cache-control
no-cache, no-store, must-revalidate
content-length
0
expires
0
c544e866-99fb-45f1-8340-da08bd01d254
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/c544e866-99fb-45f1-8340-da08bd01d254
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
4dbb47c7-ed7f-40ce-9b89-e96407c1135c
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/4dbb47c7-ed7f-40ce-9b89-e96407c1135c
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
dkfVZvfV0gdhc2R5a4arQG6Eo23V0d6t
Content-Encoding
gzip
Last-Modified
Thu, 05 Sep 2019 23:46:38 GMT
Server
AmazonS3
x-amz-request-id
45280296D20EB550
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Tue, 24 Sep 2019 09:35:23 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
tKq7230iBP/75HIazwSTtIgKBAKWav7f2wNpExvvRpJpHdOMd1onSwcOTNUFAJE7ai1oRBjulIY=
adex.js
dmp.theadex.com/d/285/5184/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/285/5184/s/adex.js?ts=22030493
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.103 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:02 GMT
server
nginx
etag
W/"5d1f5602-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Tue, 24 Sep 2019 09:40:23 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: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.119 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn1.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:23 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, 01 Oct 2019 01:31:32 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: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e686daba37260303bd5dce82de43affbc6fa3474812fe14e8dbb3e8d5e2c3455

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 24 Sep 2019 09:35:23 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1687
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
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=39609917&src.id=Stroeer
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.35.163 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-35-163.eu-central-1.compute.amazonaws.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:23 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
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/assets/
14 KB
3 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/assets/player.css
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3e519113583c968dd0daa3a70249fc54df7114ba2595bfe1644d2320e6d25aa5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 d7e55181ad8192e74c103c6003cd4d9c.cloudfront.net (CloudFront), 1.1 varnish
age
669016
x-amz-meta-mtime
1568644058
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
2419
x-served-by
cache-fra19143-FRA
last-modified
Mon, 16 Sep 2019 14:27:39 GMT
server
AmazonS3
x-timer
S1569317724.734456,VS0,VE0
etag
"d905122fc8955e89d4478cba21f53f32"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
YkR6M7Z9inQNrb87LePow1EHmtmQRaJhTMDKHiPPl19Qmn2R8lu-0w==
x-cache-hits
1024201
dsm.js
vidstat.taboola.com/vpaid/ds/176/
1 KB
761 B
Script
General
Full URL
https://vidstat.taboola.com/vpaid/ds/176/dsm.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
91ffef0e08af098862c5ee0b413103869650c929e0a65fbd29e5815e3b402609

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 71dbd5706c5b0c7b733248e1171f2d4f.cloudfront.net (CloudFront), 1.1 varnish
age
2302430
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
499
x-served-by
cache-fra19143-FRA
last-modified
Mon, 29 Jul 2019 13:39:31 GMT
server
AmazonS3
x-timer
S1569317724.736084,VS0,VE0
etag
"d2ab13c0468acb5251b93e254b36f876"
vary
Accept-Encoding
content-type
application/octet-stream
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
x-amz-cf-id
5bubRKzAzdJ6mdQCrNRW2D5xRVyIa8HqnM7MtVGBjfGulihsYyQsfw==
x-cache-hits
2093363
st
convammp.taboola.com/
0
52 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V79JACFgPOKGtV09RuTATOKGtV09RuTAUAAAAGBvQHG7FgMXcj4nAxHC2Ww91iN5hsVpvFbrJaDYEjFizmbkQcLoajxXK4W8yWi8FqOZrtJsPNFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAoDgYznW3vuxGh-vzsvsDAOAhAAQAYECBBGAAp6kEoCLn4AQAAAAAAAAAgOX___8_BkCP-EwGIENpsAfgwQfggagAsYgRAAAAACRTm8fRpE6oLKoAAAjSrQCuAAAC2sRAI8DCAAAACMYW6GHx-80Ou8bvdhkAAAAAAAAAgNn_2T-aENGYW1oQSwGv2i8gAMDaLyAAAJu6AQC8BcAFHUErBoPVGcRkM9pNZgcAAABw9____68HkqvdxLQxLJa75cZmGU1ck8VssLItRg7TcDmyDbc3RwHpGl0S8tA3Iiyz33dQUE5Pj9llkLFcJoNaIGuaXH6D-KBhWE4GwfwmbDFaTSab5XC2XEwGw9FwNNqfwI0GOEHD4WCxGyx2i8VwspiMBsvBAgViMMEJGY42k9Vot9pNlsPJaDTbTDZI0arVbLQZDFezyWy3Ww0Hw-VohBStWcwmk8VstNxtBsvJaDCcDIcIM66RcTgaLdy6wcizFg0mhrXEZRuuZZ6VbTcb2SyeiWkten1Mp-FmNhz5tigYoLQXwUU60Zwuf5fL8ta8LW6d0-ewiCWak0U6kV32zdVuYtoYFsvdcmOzjCauyWI2WNkWI4dpuBzZhvuOa2QcjkYLt24w8qxFg4lhLXHZhmuZZ2XbzUY2i2diWoteH9NpuJkNR759YzVbbha73WK5b6xmy81it1ss9x06w3f1ORuVN63Co7JlPiuxV-Y0KFwGi_cnMS2m3dnB8_sdnSrVRWNsyL4JhdngMRgUsURwukgnopfxdBFLJE-LdKJxGBejkcnj8m1sC9PIZFgsNpvNajhzOCcTx2piEUuUpot0ote9LA7D4fMXPJyHh9kvehoOn7_g4Tw8zG6x3-e0uzV_t85lNH3eqrvJrfm7xX6X5_RWGi1vsd_ntLsFl7_F7HK7LOo_NsRoNNfN5orBcq4ZrBIAAAAAAAAAwBLmzJsAAAAAnAayWAwmi-UCQIix7hJ8SoU8OoG_FTd-DDGny9_lsrw1b4tb5_Q5rAwgsVMA!&cmcv=&uv=23141&unm=FEED_MANAGER&cb=1569317723726&abt=expl_vC!flrr3_vB!ufm_vA&baseReportD=taboola.com&dataCenter=am&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.13.12 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1569317724.742808,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4038-HHN
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1569317723758.192363218
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Tue, 24 Sep 2019 09:35:23 GMT
Last-Modified
Thu, 19 Sep 2019 14:13:24 GMT
ETag
"5d838d04-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Content-Length
98
p.min.js
cdn.emetriq.de/adp/profiling/0.2.14/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.14/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:6400:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
55945c84253b1537f12101e52b67c9c6d3cf0041e132f9fbd6fbec1cbe0eb199

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 19 Sep 2019 08:35:46 GMT
content-encoding
gzip
last-modified
Thu, 19 Sep 2019 06:59:21 GMT
server
AmazonS3
age
435578
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
CQVfwkL0hpmhcVdsVtjtq6NXgVLADS2G
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA56
content-type
application/javascript; charset=utf-8
x-amz-cf-id
mhIZUQshkO7GpdI4Avnnay-ZwFQIzAV-tdlmTRsrKHuvauMQsO1I2g==
via
1.1 3664cc1fd21a07e55327a9c256fa758a.cloudfront.net (CloudFront)
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
89.163.159.120 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 24 Sep 2019 09:35:23 GMT
content-length
56
content-type
text/plain; charset=utf-8
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=385e248010686f30324fc61ba2109da3&event_id=page_view&_sid=69511&_ver=0.2.14&_seg=jsonp&_=107890039368
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.14/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
38dae1dd21f62600f343dbf64c64fccd470fde91e5355b77ce27ef2f3ea6a7c7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 24 Sep 2019 09:35:23 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
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.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.35.6 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-35-6.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 23 Sep 2019 14:05:02 GMT
Content-Encoding
gzip
Last-Modified
Mon, 23 Sep 2019 14:03:47 GMT
Server
akka-http/10.1.9
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 1BB5
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESB-WsRkBsJkESUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4204791044702082191
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4204791044702082191
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 24 Sep 2019 09:35:23 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Tue, 24 Sep 2019 09:35:23 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4204791044702082191
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
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 93CC
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?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.108 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
anj=dTM7k!M4.FE:2jUF']wIg2GUjua^N@!@wnfH8KW.eDVp+Z0rgEVYmQOE<`tPFTR_rG9A`HVYXeoT(.r!D`*HBW4N]Zkccz((j#iP(Md+>)fy+$)h/r5
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Tue, 24 Sep 2019 09:35:23 GMT
Age
4233208
Connection
keep-alive
X-Served-By
cache-jfk8124-JFK, cache-fra19137-FRA
X-Cache
HIT, HIT
X-Cache-Hits
1, 1077043
X-Timer
S1569317724.965104,VS0,VE0
Vary
Accept-Encoding
pd
eu-u.openx.net/w/1.0/ Frame 1764
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?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
i=c2f60a1b-3d12-06ca-2497-f2d5a05c9836|1569317723
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
vary
Accept
set-cookie
i=c2f60a1b-3d12-06ca-2497-f2d5a05c9836|1569317723; Version=1; Expires=Wed, 23-Sep-2020 09:35:23 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1569317723|mOgikimWiygu; Version=1; Expires=Wed, 09-Oct-2019 09:35:23 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Tue, 24 Sep 2019 09:35:23 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=c2f60a1b-3d12-06ca-2497-f2d5a05c9836|1569317723; Version=1; Expires=Wed, 23-Sep-2020 09:35:23 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.163.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
Tue, 24 Sep 2019 09:35:23 GMT
content-length
0
via
1.1 google
alt-svc
clear
activation
adstax-match.adrtx.net/ Frame EC45
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909161255/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.71.27 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Tue, 24 Sep 2019 09:35:24 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
/
ssl.3.damoh.giga.de/65fed95a6d6fbb31d955c9934936d8277ddc63ba/ Frame 19CF
109 B
671 B
XHR
General
Full URL
https://ssl.3.damoh.giga.de/65fed95a6d6fbb31d955c9934936d8277ddc63ba/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.113.38 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.38.113.9.5.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Tue, 24 Sep 2019 09:35:24 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://videos.giga.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
109
/
ssl.3.damoh.giga.de/499b77eee6cd4efdcb0ec0be131044ebb673dafd/ Frame 19CF
42 B
875 B
XHR
General
Full URL
https://ssl.3.damoh.giga.de/499b77eee6cd4efdcb0ec0be131044ebb673dafd/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGthaE1hYmllcXVvZWdlUmk9a2FoTWFiaWVxdW9lZ2VSaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUmV8fCh4LlJlPTApO3guUmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5SZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5ZYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5WbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkthPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZmYoYyk7YS5zdChsKTthLnJ0KG0pO2EuYnQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkdiLmxlbmd0aCl7dmFyIGE9bC5HYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSXM9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Pcj1iO2IucHJvdG90eXBlPXtIczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLklzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Pcnx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuSHMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVm49ITE7dGhpcy5UYT0ic2V0dXAiO3RoaXMuTGM9W107dGhpcy5qZSgpOwp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5Scy5iaW5kKHRoaXMpKTt0aGlzLmtiPXt9O3RoaXMuTmc9e307dGhpcy5jZj0hMX1jLnpqPWI7Yi5wcm90b3R5cGU9e050OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmtiKXRoaXMua2IuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMua2JbYl0rIl8iKTtyZXR1cm4gYX0sQWM6ZnVuY3Rpb24oKXt0aGlzLmNmfHwodGhpcy5jZj1lLmJhKDEwKSk7cmV0dXJuIHRoaXMuY2Z9LGxiOmZ1bmN0aW9uKGEpe3RoaXMua2JbYV18fCh0aGlzLmtiW2FdPTApO3RoaXMua2JbYV0rPTE7NTx0aGlzLmtiW2FdJiYhdGhpcy5OZ1thXSYmKHRoaXMuTmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5OdCgpLCEwKSl9LGplOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sCmV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxUbTpmdW5jdGlvbihhKXt0aGlzLmFhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxtYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sUnM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUXMoYS5kYXRhKX0sUXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLApkPTA7ZDxiO2QrKyl0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXImJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXSYmYS5ldmVudD09dGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sYmU6ZnVuY3Rpb24oYSxiKXt0aGlzLmFhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sbGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuZWgoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFJwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOwppZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxSbTpmdW5jdGlvbihhLGIpe2lmKGImJiEoMD50aGlzLmxhKGEpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGE9PWIpe2lmKGUuQnAoYSkpcmV0dXJuOyhiPXRoaXMubGcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxCcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSwKdGc6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5hYS5vcmlnaW5hbFVybHMmJnRoaXMuYWEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmFhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LGViOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sdGU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxDZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sCkhoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sQmU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTsKdmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighZylyZXR1cm4hMTtuPWcuaGVpZ2h0Kmcud2lkdGg7ZD1nLndpZHRoO2Y9Zy5oZWlnaHQ7MD5nLnRvcCYmKGYrPWcudG9wKTtnLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWcuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmcubGVmdCYmKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmUoYS5lbCwKYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8KGEuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihiKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1hLnN0YXJ0VGltZT49YS50aW1lTVMpe2EuY2IoKTtyZXR1cm59fWVsc2UgYS5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNlKGEpfS5iaW5kKHRoaXMpLDEwMCl9LEViOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGJhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSx2ZTpmdW5jdGlvbihhKXt2YXIgYj0KMCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LEVoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGg9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGgrPWYudG9TdHJpbmcoMTYpO3JldHVybiBofWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEw9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdCxCLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gobik7c3dpdGNoKHAlCjQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChwPj4+MjkpO3EucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxxLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3Q9TDtCPWw7Zm9yKGY9MDsxOT49ZjtmKyspcj1kKG4sNSkrKHAmbXx+cCZ0KStCK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LEI9dCwKdD1tLG09ZChwLDMwKSxwPW4sbj1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQobiw1KSsocF5tXnQpK0IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKG4sNSkrKHAmbXxwJnR8bSZ0KStCK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChuLDUpKyhwXm1edCkrQitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxCPXQsdD1tLG09ZChwLDMwKSxwPW4sbj1yO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0w9TCt0JjQyOTQ5NjcyOTU7bD1sK0ImNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihMKStiKGwpKS50b0xvd2VyQ2FzZSgpfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksCmY9YS5jaGFyQ29kZUF0KGsrKyksbj1hLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfG4+PjYsZz1uJjYzLGlzTmFOKGYpP2U9Zz02NDppc05hTihuKSYmKGc9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSwKdmM6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxuPSExLGM9ITEsZT0hMSxnPSExLGs9ITEsbT0hMSxsPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gocCl7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLk5iPyEwOiExfWNhdGNoKHQpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwKLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocSl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LE1wOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy52YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LExhOmZ1bmN0aW9uKCl7dmFyIGE9Cnt1aTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxIaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxzcTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxZazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxBbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERuOmZ1bmN0aW9uKCl7cmV0dXJuIGEudWkoKXx8YS5IaSgpfHwKYS5zcSgpfHxhLllrKCl8fGEubG0oKXx8YS5zaygpfHxhLkFsKCl9fTtyZXR1cm4gbnVsbCE9YS5EbigpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEJhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXE6ZnVuY3Rpb24oKXt2YXIgYT0iIixiPSIiLGQ9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsCmI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx6bzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxKdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKG4pe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHlnOmZ1bmN0aW9uKGEpe2E9Ck1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVmgoYikrIjoiK3RoaXMuVmgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFZoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZjpmdW5jdGlvbihhKXt0aGlzLlRhPWF9LHZnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuVGE7dGhpcy5XZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0seGM6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLnZnKGQsYixhKX0sdjpmdW5jdGlvbihhLApiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlhhKGIsZCkpO2ImJihBPWsuWGEoYSxiKSk7ZiYmKEE9ay5YYShBLGYpKTtuJiYoQT1rLlhhKEEsbikpO2MmJihBPWsuWGEoQSxjKSk7ZyYmKEE9ay5YYShBLGMpKTtlLnhjKEEpfSxUczpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuYXEoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPQoxO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sV2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5UcyhhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wuemEoYSwhMCk7YT1sLnphKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1iO2wuTWEoYSxmdW5jdGlvbigpe30pfX0sCnRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5OY3x8KHRoaXMuTmM9e30pO3RoaXMuTmNbZl18fCh0aGlzLk5jW2ZdPTApO3RoaXMuTmNbZl0rKzsxMDx0aGlzLk5jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnphKGYsITApLGY9bC56YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKwoiKiIsbC5NYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxKZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC4kbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmCmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxpYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkVlKGEpfHx0aGlzLlpxKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYmYmJndpbmRvdy5zYW5kYm94LmJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guYmZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMudGcoYSkpcmV0dXJuIHRoaXMudGcoYSk7CnZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuWWEoYSxiLkphLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goZSl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLnVkKCkucmVwbGFjZSgiW2hhc2hdIiwKYy5oYXNoKSk7dGhpcy5SbShjLGEpO3JldHVybiBjfSxZYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay56YShhLGMpO2M9ay56YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuTWEoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGYsbixrLGUsZyl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7CmZvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LHRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkxjKWZvcih2YXIgYyBpbiB0aGlzLkxjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuTGNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS52YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy52YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMudHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0seXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTGM9YX0sa3Y6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLllhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LEVuOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxVcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFI9Yy56anx8ClI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMueWo9YjtiLlhhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Kcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Mcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5TdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmtwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZXY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5VZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIiwKbmFtZToiYWRTdGFydCJ9O2IuTmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlJmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlZmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5LbT17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5QZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnp1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Lcj17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIubHA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLll1PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmlnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2Iuc289e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlRmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkU2tpcHBlZCJ9O2IuTW09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5ZZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi4kZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuTG09e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmJpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuTnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi54ZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi50Zj0Ke2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmpnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5SdT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53dT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLk1yPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLnlqfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy51cT10aGlzLmFbMV07dGhpcy5LcT10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs5XX1jLmNyPWI7Yi5wcm90b3R5cGU9e3RxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cTp0aGlzLkpxKGEpfSxKcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS3E6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmNyfHxrYSxtYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1tYy50cSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLkFqPWI7Yi5wcm90b3R5cGU9e3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSwKamE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LFZwOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG9kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwppZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudmUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxOcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhKCkrIjIifSxUZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnZlKHRoaXMuVnAoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT0KYi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuQWp8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVW89dGhpcy5hWzddO3RoaXMuTmw9dGhpcy5hWzJdO3RoaXMuZHM9dGhpcy5hWzZdO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuSmw9dGhpcy5hWzldO3RoaXMucW09dGhpcy5hWzJdO3RoaXMuY2w9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50aT1iO2IucHJvdG90eXBlPXtUbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVW86dGhpcy5NbChhKX0sTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5sOnRoaXMuY3MoYSl9LGNzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kczp0aGlzLlZtKGEpfSxWbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV206dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuSmw6dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnFtOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2w6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLnRpfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5Ubyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuTGk9Yn0pKGMpO3ZhciBNPWMuTGl8fE07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUms9dGhpcy5hWzddO3RoaXMuZ2s9dGhpcy5hWzVdO3RoaXMuU2w9dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzldO3RoaXMueG49dGhpcy5hWzEwXTt0aGlzLkNrPQp0aGlzLmFbMTBdO3RoaXMubG89dGhpcy5hWzVdO3RoaXMuZ3Y9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5XaT1iO2IucHJvdG90eXBlPXtRazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUms6dGhpcy5mayhhKX0sZms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdrOnRoaXMuUmwoYSl9LFJsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TbDp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVGs6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Dazp0aGlzLmtvKGEpfSxrbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG86dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmd2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgbWE9Yy5XaXx8Cm1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLlFrKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Muamw9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5OYT17fTt0aGlzLks9bnVsbDt0aGlzLkhjPTEwMDt0aGlzLkZiPTA7dGhpcy5VYT0xNTA7dGhpcy5IYj0wO3RoaXMudHQoYil9LGc6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPD10aGlzLlVhPyh0aGlzLkZiKyssdGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSk6MD50aGlzLlVhJiYodGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkhjKSl9LGR0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmI+dGhpcy5VYT8hMDohMX0sYWY6ZnVuY3Rpb24oKXt0aGlzLkZiPTB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSwKdHQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLk5hW2IuamEoKV09YjtOJiZOLmFoJiZOLk10KGIpfSxOdjpmdW5jdGlvbigpe3JldHVybiBlLnRlKHRoaXMuTmEpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsaDtmb3IoaCBpbiB0aGlzLk5hKWlmKGE9PXRoaXMuTmFbaF0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTmFbYi5qYSgpXT8hMDohMX0sVnE6ZnVuY3Rpb24oYil7Yj1iLklhKCk7Zm9yKHZhciBhIGluIHRoaXMuTmEpaWYoYi5pZD09dGhpcy5OYVthXS5JYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxhdzpmdW5jdGlvbihiKXt0aGlzLk5hW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLmpsfHxxOyhmdW5jdGlvbihjKXtjLmxsPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9CnRoaXMuaWQ9bnVsbDt0aGlzLkhjPTEwO3RoaXMuRmI9MDt0aGlzLlVhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnpiPSIiO3RoaXMubmc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGg9dGhpcy5JYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9aCliLmNvbnRhaW5lcklkPWguaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxTOmZ1bmN0aW9uKCl7fSxPYTpmdW5jdGlvbigpe30sQnQ6ZnVuY3Rpb24oYil7dGhpcy5WPWJ9LE92OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVn0sd3Q6ZnVuY3Rpb24oYil7dGhpcy5NZT1ifSxNdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1lfSxMZTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbigpe3RoaXMuRmI8PXRoaXMuVWEmJih0aGlzLkZiKyssCndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTtlbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sQmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sCmphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sY3c6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubXEoKXx8dGhpcy5ObSgpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSxQdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxObTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5iYSgxMCkpfSxtcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKT8hMDohMX0sWTpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxJYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxBZTpmdW5jdGlvbigpe3JldHVybiEwfSwKaXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5kdXJhdGlvbj9iLmR1cmF0aW9uOjB9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFd2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LENoOmZ1bmN0aW9uKGIpe3RoaXMuemI9Yn0sTHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0seWg6ZnVuY3Rpb24oKXt0aGlzLnpiPQpudWxsfSxSdjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuemImJihiPSEwKTtyZXR1cm4gYn0sWXY6ZnVuY3Rpb24oKXt0aGlzLm5nfHwodGhpcy5uZz0hMCl9LHFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdT1jLmxsfHx1OyhmdW5jdGlvbihjKXtjLm5pPU0uZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5LPXRoaXMucGxheWVyPSIiO3RoaXMuSmY9IjEiO3RoaXMuS2Y9IjIiO3RoaXMuR209IjMiO3RoaXMuUGM9MDt0aGlzLmloPTMwO3RoaXMuTGI9W107dGhpcy5mYj1bXTt0aGlzLmpjPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlhmPXRoaXMuWWg9ITE7dGhpcy5zdGF0dXM9dGhpcy5QYzsKdGhpcy5pZD1lLmJhKDEwKTt0aGlzLmZmKGIpO3RoaXMudXQoYSl9LGc6ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dGhpcy5ZaHx8KHRoaXMuWWg9ITAsZS5KZSgpKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSxJcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT1uZXcgSjt3aW5kb3dbYS5pYSgpXXx8KHdpbmRvd1thLmlhKCldPXt9KTt3aW5kb3dbYS5pYSgpXVtiLmphKCldfHwod2luZG93W2EuaWEoKV1bYi5qYSgpXT17fSx3aW5kb3dbYS5pYSgpXVtiLmphKCldLmluaXRpYXRvcj1lLkFjKCkpO3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT93aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV0rKzp3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UuQWMoKV09MX0sU3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLAphPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLkFjKCkmJih0aGlzLmdmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudWEoKSl7dGhpcy5JcSgpO2lmKCF0aGlzLlNxKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLmdmKCk7cmV0dXJufXRoaXMuZ2YoKTt0aGlzLksodGhpcy5nZXRQbGF5ZXIoKSxoKTt0aGlzLlJoKCk7dGhpcy5YZj0hMDthJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpO3JldHVybiEwfXJldHVybiExfSxzOmZ1bmN0aW9uKGIsYSl7dGhpcy51YSgpfHwodGhpcy5MYi5wdXNoKGIpLHRoaXMuZmIucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5MYiYmMDx0aGlzLkxiLmxlbmd0aCYmKHRoaXMuTGI9CmUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuZmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5mYi5sZW5ndGg7aCsrKXRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPT10aGlzLmpjW2JdJiZhLnB1c2godGhpcy5mYltoXS5kZXRhaWwpLHRoaXMuamNbdGhpcy5mYltoXS5yZWFzb25dPHRoaXMuamNbYl0mJihhPVtdLGEucHVzaCh0aGlzLmZiW2hdLmRldGFpbCksYj10aGlzLmZiW2hdLnJlYXNvbik7dGhpcy5qY1tiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihoPWUudW5pcXVlKGEpLGI9YisiLSIraC5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LFF2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGZ9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxnZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuS2Z9LHp0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuR219LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSmZ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLktmfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSx1dDpmdW5jdGlvbihiKXt0aGlzLks9Yn0sVHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSx3cjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMubml8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHQ9dGhpcy5hWzldO3RoaXMuc2k9dGhpcy5hWzNdO3RoaXMuRnA9dGhpcy5hWzFdO3RoaXMudGo9dGhpcy5hWzFdO3RoaXMub3E9dGhpcy5hWzddOwp0aGlzLmVuPXRoaXMuYVsxXTt0aGlzLmZwPXRoaXMuYVs1XTt0aGlzLmhsPXRoaXMuYVsyXTt0aGlzLkdrPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMuVWs9YjtiLnByb3RvdHlwZT17a3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmx0OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zaTp0aGlzLkVwKGEpfSxFcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRnA6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcTp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW46dGhpcy5lcChhKX0sZXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZwOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLkZrKGEpfSxGazpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkdrOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuVWt8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLmt0KDQpOyhmdW5jdGlvbihjKXtjLmdqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7dGhpcy5ZKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlbzt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sCk86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLmdqfHxwYTsoZnVuY3Rpb24oYyl7Yy5oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIuQXY7YT9hLm5hP2EubmEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYoYj1hLmRldGFpbC5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZSYmKGYrPWIuZ2V0RXJyb3JDb2RlKCkpO2IuZ2V0TWVzc2FnZSYmKGYrPWIuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMucygiZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5oanx8cWE7KGZ1bmN0aW9uKGMpe2MuaWo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllck1hbmFnZXImJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMmJndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGI9bmV3IHBhKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgcWEoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7CnZhciByYT1jLmlqfHxyYTsobmV3IHJhKHIpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXM9dGhpcy5hWzRdO3RoaXMuWWw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbMl19Yy56cz1iO2IucHJvdG90eXBlPXtEczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXM6dGhpcy5YbChhKX0sWGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLllsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgc2E9Yy56c3x8c2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMuRHMoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5WYj0KITE7dGhpcy5zZygpO3RoaXMudWcoKTt0aGlzLnJvPSExfSxzZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLlZiPSEwKTt0aGlzLlooYSl9fSxPYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTsKZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKSl9LExlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuSGQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpKX0sCkhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5NZSYmKDAsdGhpcy5NZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFZhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PQp0aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMuYWt8fHRhOyhmdW5jdGlvbihjKXtjLiRqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QYzt0aGlzLmlzUGxheWluZz10aGlzLlJjPSExO3RoaXMuWmQ9MTt0aGlzLlNjPVtdO3RoaXMudGI9CiExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLlpkPTE7dGhpcy5TYz1bXTt0aGlzLnRiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlpkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy50Yj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMudGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmCih0aGlzLnRiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy50Yj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnVhKCkmJih0aGlzLnJhKCksdGhpcy5nZXRQbGF5ZXIoKS5ybz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuemI7YSYmKGEuemQoKSxhLmhkKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJiF0aGlzLnVhKCkmJih0aGlzLnRiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnRhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy53KCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuU2MubGVuZ3RoPj10aGlzLlpkJiZ0aGlzLm0oKSl9LHdyOmZ1bmN0aW9uKGIpe3RoaXMubygiSlc6ICIrYi50eXBlKX0sbTpmdW5jdGlvbihiKXtiPwp0aGlzLm5lP3RoaXMubmUrKzp0aGlzLm5lPTE6dGhpcy5tZT90aGlzLm1lKys6dGhpcy5tZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5IaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLm1lPnRoaXMubmUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5zZygpLGEudWcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHVhPWMuJGp8fHVhOyhmdW5jdGlvbihjKXtjLmJrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwKIWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGgmJmgoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuVnEoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSxLdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxQcDpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMuYmt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dj10aGlzLmFbOF07dGhpcy5DbD10aGlzLmFbOV07dGhpcy5vbD10aGlzLmFbMl07dGhpcy5Hcz10aGlzLmFbMV07dGhpcy5kdj10aGlzLmFbMTBdO3RoaXMudWs9dGhpcy5hWzRdO3RoaXMuRWs9dGhpcy5hWzddOwp0aGlzLmo9dGhpcy5hWzVdfWMuQ209YjtiLnByb3RvdHlwZT17c3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnR2OnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DbDp0aGlzLm5sKGEpfSxubDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub2w6dGhpcy5GcyhhKX0sRnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdzOnRoaXMuY3YoYSl9LGN2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdjp0aGlzLnRrKGEpfSx0azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudWs6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Fazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLkNtfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9cmMuc3YoNCk7KGZ1bmN0aW9uKGMpe2MuY209dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTWQoYil9LmJpbmQodGhpcykpfSxNZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiYKdGhpcy5WKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFZhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB5YT1jLmNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5ibT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQ2M9dGhpcy5BYT10aGlzLlljPSExO3RoaXMudmg9ZS5FYigxMCk7dGhpcy5YaD0hMDt0aGlzLm9jPXRoaXMuUWc9ITE7dGhpcy5KcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLlhuKCksdGhpcy5vYigpKX0sSnI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQmEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsCiI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouR2E6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5HYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuR2E/Yi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5HYT90eXBlb2YgYi5pbWEuR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouR2E/Yi5KLkdhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJgpiLkouR2E/dHlwZW9mIGIuSi5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5YZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09CnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy53YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Mpe3ZhciBiPXRoaXMud2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5DYz0KYi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkNjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuQ2N9LFRxOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMud2IoKSxhPXRoaXMuUnEoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sUnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG9iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5acygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LFpzOmZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5MYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iKwpkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2lmKGUuQmEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnBjPSEwO2UuQmEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5wYz0hMDtlLkJhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnMoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vYigpfS5iaW5kKHRoaXMpLDIwKX0sSnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSxYbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy5zKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuUGUoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJgpob21hZFV0aWxzLlgpaG9tYWRVdGlscy5LYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLlRxKCkpe3ZhciBhPXRoaXMud2IoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy53YigpLHRoaXMuUmIoKSx0aGlzLm9jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2M/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy53YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMud2IoKSxiPXRoaXMuUmIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7YnJlYWt9fSxZbjpmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnNjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuc2MhPWIuYWRzLnN0YXRlJiYodGhpcy5zYz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5zYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLnNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZbigpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy51YSgpfHwoYnx8KHRoaXMuWGg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuSSh0aGlzLlhoLGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxjbzpmdW5jdGlvbigpe3RoaXMuU3Z8fCgxMDx0aGlzLkV1Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXUrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5jdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxjdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5GdSl7dGhpcy5GdT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLAoidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpOwp2YXIgemE9Yy5ibXx8emE7KGZ1bmN0aW9uKGMpe2MuZG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSWgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkloKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEloOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUudGUoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksCihuZXcgemEoYSx0aGlzLkspKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUjpmdW5jdGlvbigpe3RoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgQWE9Yy5kbXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVsxMF07dGhpcy5Baz10aGlzLmFbNl07dGhpcy5xcz10aGlzLmFbNV07dGhpcy4kbD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLnpxPWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLnprKGEpfSx6azpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWs6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFzOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy4kbDoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLnpxfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5lcig0KTsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlNlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpO3JldHVybn10aGlzLlkoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYj90aGlzLlooYik6dGhpcy5wYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnpiLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuU2U9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxWYTpmdW5jdGlvbigpe3RoaXMuU2UrKztpZigxMDx0aGlzLlNlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sT2E6ZnVuY3Rpb24oKXt9LE1kOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9fSl9KShjKTsKdmFyIERhPWMuJGt8fERhOyhmdW5jdGlvbihjKXtjLlprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGUpaWYodGhpcy5BYnx8KHRoaXMuQWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5BYisrLDE1PHRoaXMuQWIpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5wZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm5wPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMubnA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5NcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkkoYil9fSl9KShjKTt2YXIgRWE9Yy5aa3x8RWE7KGZ1bmN0aW9uKGMpe2MuYWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5VYT0KMTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMuYWx8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Saj10aGlzLmFbN107dGhpcy5jcD10aGlzLmFbM107dGhpcy5iaj10aGlzLmFbOF07dGhpcy5Qaj10aGlzLmFbNl07dGhpcy5EdT10aGlzLmFbN107dGhpcy5scz10aGlzLmFbOV07dGhpcy5KbT10aGlzLmFbMTBdO3RoaXMuSHE9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5Ecj1iO2IucHJvdG90eXBlPXtRajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmo6dGhpcy5icChhKX0sYnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmNwOnRoaXMuYWooYSl9LAphajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYmo6dGhpcy5PaihhKX0sT2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBqOnRoaXMuQ3UoYSl9LEN1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EdTp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHM6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5KbTp0aGlzLkdxKGEpfSxHcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9Yy5Ecnx8SGEsdGM9bmV3IEhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dGMuUWooNCk7KGZ1bmN0aW9uKGMpe2MuVmo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkNnKGIsImVsZW1lbnRJRCIpO3RoaXMucWg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKToiYWZ0ZXIiPT10aGlzLnFoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsYSk7dGhpcy5ZKGgpO3RoaXMuWihoKTt0aGlzLm5kPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSwKcGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYm86ZnVuY3Rpb24oKXtlLldnKHRoaXMubmQpO2UuQmUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5Wanx8SWE7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkkoITApfX0pfSkoYyk7dmFyIEphPWMuVWp8fEphOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVWE9MTUwMDt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLkNnKGIsImVsZW1lbnRJRCIpOwplLldnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLldqfHxLYSxMYT1uZXcgS2Eocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMud289dGhpcy5hWzldO3RoaXMubG49dGhpcy5hWzhdO3RoaXMuTHM9dGhpcy5hWzZdO3RoaXMua209dGhpcy5hWzFdO3RoaXMueG09dGhpcy5hWzhdO3RoaXMuQ3M9dGhpcy5hWzldO3RoaXMuT289dGhpcy5hWzZdO3RoaXMua3I9dGhpcy5hWzRdO3RoaXMuTGw9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbNF19Yy53dj0KYjtiLnByb3RvdHlwZT17dW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZuOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mczp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmttOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54bTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3M6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk9vOnRoaXMuanIoYSl9LGpyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rcjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTGw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgTWE9Yy53dnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMudW4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLkJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHZ0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sT206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Canx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLmJiPWE7dGhpcy54Zz10aGlzLmdpPQohMTt0aGlzLm1oPWQ7dGhpcy5KaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5iYj1uZXcgeShhKSk7dmFyIGM9dGhpcy5xYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5GZSh0aGlzLmJiLnVybCkmJmwuTmQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLnZ0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sCmZ1bmN0aW9uKCl7bC5rYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuQ2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMueGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkpoP3RoaXMucWIub3Blbih0aGlzLmJiLm1ldGhvZCx0aGlzLmJiLnVybCwhMSk6dGhpcy5xYi5vcGVuKHRoaXMuYmIubWV0aG9kLHRoaXMuYmIudXJsLCEwKSx0aGlzLmdpfHwodGhpcy5xYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucWIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksCmFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnFiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnFiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5GZSh0aGlzLmJiLnVybCk/bC5OZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkZlKHRoaXMuYmIudXJsKSx0aGlzLm1oJiZ0aGlzLm1oKCl9cmV0dXJuIHRoaXMucWJ9fX0pKGMpO3ZhciBOYT1jLkNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuS2E9ITE7dGhpcy5yYz0iIjt0aGlzLmVlPXRoaXMucWM9dGhpcy51Yj1udWxsO3RoaXMuQW89dGhpcy5HYj10aGlzLmRoPSExO3RoaXMuSmE9IiI7dGhpcy5ZZz0hMTt0aGlzLkZhPXRoaXMucmQ9IiI7dGhpcy5VZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5aZT0hMTt0aGlzLkNhPVtdO3RoaXMuS2c9dGhpcy5aYj0iIjt0aGlzLmxlPSExO3RoaXMucGY9MDt0aGlzLkVmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiOwp0aGlzLkNmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5pYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5EZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuYWM9IiI7dGhpcy5iYz1bXTt0aGlzLmNjPVtdO3RoaXMuTGQ9W107dGhpcy4kYj0iIjt0aGlzLnFmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuQmM9ITE7dGhpcy5lbz10aGlzLk9kPW51bGw7dGhpcy5GaD10aGlzLmdjPXRoaXMucGc9dGhpcy51Zj10aGlzLk5kPXRoaXMuZ2U9dGhpcy5RYz0hMTt0aGlzLmdiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnRkPTA7dGhpcy5NZz0hMTt0aGlzLkxnPTFFMzt0aGlzLiRjPSExO3RoaXMuUWE9MUUzO3RoaXMuTWY9IiJ9Yy5Eaj1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5LYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy5yYyxhZHRhZ21vZGlmaWVyOnRoaXMudWIsYWR0YWdtb2RpZmllckFkdjp0aGlzLnFjLGFkdGFncmVnZXg6dGhpcy5lZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5kaCxzaWRlbG9hZHM6dGhpcy5HYixkaXNhYmxldGVzdHM6dGhpcy5Bbyxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLllnLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLkZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWCxpc0Jsb2NrZWQ6dGhpcy5VZyxzZXJ2ZXI6dGhpcy5DYSxzdm1Db25maWc6dGhpcy5aYixob21hZEFkcGF0aDp0aGlzLktnLGRpc2FibGVDb29raWVUZXN0OnRoaXMubGUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMucGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5FZixIT01BRF9CTE9DS0VEOnRoaXMuQ2YsSE9NQURfTk9CTE9DS0VSOnRoaXMuS2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaWMsCkhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5EZix0ZXN0SGlkZTp0aGlzLmFjLHRlc3RUYWdzOnRoaXMuYmMsdGVzdFRhZ3NKUzp0aGlzLmNjLHRlc3RUYWdzWEhSOnRoaXMuTGQsdGVzdENvb2tpZTp0aGlzLiRiLHRocm90dGxlOnRoaXMucWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5CYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmVvLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuUWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLmdlLHVzZVN0cmljdENoZWNrczp0aGlzLk5kLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuZ2Isc2l0ZUNvbmZpZzp0aGlzLmFiLHNlcnZlcklkOnRoaXMuQmgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLndjLHZwYWlkOnRoaXMuZ2Msc2tpcEFsbG93ZWQ6dGhpcy5GaCx2bWFwczp0aGlzLmNpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy4kYyxhZEZhbGxiYWNrVVJMOnRoaXMuTWZ9fSwKa3E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuZ2IpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5nYltiXSYmMT09dGhpcy5nYltiXSYmKGE9ITApO3JldHVybiBhfSxkZjpmdW5jdGlvbihhKXt0aGlzLmdiW2FdPSEwfSxRcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5nYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmdiW2JdJiYxPT10aGlzLmdiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsCmRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLkVuKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuS2EmJiFiKXJldHVybiBuZXcgeShhKTtmPXRoaXMuRWUoYSk7Yz10aGlzLmxhKGEpO2Y/KHRoaXMuRGMoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRGQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5yY3x8dGhpcy51Ynx8dGhpcy5xY3x8dGhpcy5lZSkmJihnPXRoaXMuQXIoZykpO2E9bmV3IHkoZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5TcChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Cmc7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMudmIoZyk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuRGMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LERjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkNhJiZ0aGlzLkNhLmxlbmd0aCYmMDx0aGlzLkNhLmxlbmd0aCYmKGI9dGhpcy5DYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9CmIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5FZShhKTtyZXR1cm4gYn0sU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuRnY7cmV0dXJuIm5vbmUifSx1ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkNhW3RoaXMuQmhdfSxEZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudWQoKSxiPXRoaXMuRWgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsCmIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LGpoOmZ1bmN0aW9uKGEsYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS5sYShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuamgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj0KdGhpcy5qaChkLnF1ZXJ5S2V5W2NdLGMsYltjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEFyOmZ1bmN0aW9uKGEpe3RoaXMucmMmJihhKz10aGlzLnJjKTtpZih0aGlzLnViKWZvcih2YXIgYiBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMudWJbYl0pKTt0aGlzLnFjJiYoYT10aGlzLnpyKGEsdGhpcy5xYykpO3JldHVybiBhfSxsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5ZZz0hMDt0aGlzLnJkPWE7dGhpcy5GYT1iO3RoaXMuWmU9ZDt0aGlzLk9kPWY7dGhpcy50Yz1jO3RoaXMuYWI9ZXx8e307dGhpcy5zcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5GYSl0aGlzLnFyKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkZhKXRyeXt0aGlzLkZhPQpiKCksdGhpcy5kZCgpfWNhdGNoKGcpe3RoaXMua2EoIm5vQ2xpZW50Q29uZmlnIil9fSxuYjpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0sc3I6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMucmQrdGhpcy5hZSgiZ2xvYmFsIikpLHRoaXMuZ3EuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5kZCgpfS5iaW5kKHRoaXMpLCEwKX0scXI6ZnVuY3Rpb24oKXt0aGlzLk1hKG5ldyB5KHRoaXMuRmErdGhpcy5hZSgiY2xpZW50IiwtMSE9dGhpcy5GYS5pbmRleE9mKCI/IikpKSx0aGlzLmRkLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRmKCJjbGllbnQiKTt0aGlzLmthKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksCiEwKX0sYWU6ZnVuY3Rpb24oYSxiKXt2YXIgZDtkPShiPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLkViKCkpO3RoaXMuYWImJnRoaXMuYWIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihkPSIiKTt0aGlzLmFiJiZ0aGlzLmFiLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sa2E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2Upe3RoaXMuZ2U9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGM9ITEpO3RoaXMudGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy50Yz90aGlzLnRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5VZz0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuQ2YpKTt0aGlzLkliKCk7ZS54YyhrLkpzKTsoYj1lLlNiKHRoaXMudWQoKSkpfHwoYj1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxncTpmdW5jdGlvbihhKXtpZighdGhpcy5YKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChkKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuRmF8fHRoaXMuWmJ8fHRoaXMuSmF8fHRoaXMuZGQoKToodGhpcy5LYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuS2IpKSx0aGlzLkliKCkpfX0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChkKXthPXRoaXMuRmF9ZWxzZSBhPXRoaXMuRmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5kYyhhLmVuYWJsZWQpO3RoaXMuWD0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5DYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQ2EubGVuZ3RoO2IrKyl0aGlzLkNhW2JdPXRoaXMuQ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO3RoaXMuWmI9YS5jb25maWd8fCIiO3RoaXMuSmE9YS5hbGlhc3x8bnVsbDt0aGlzLktnPWEuYWRwYXRofHwiIjt0aGlzLmxlPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuQmg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuQ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5aYiYmdGhpcy5KYSYmdGhpcy5DYS5sZW5ndGg/dGhpcy5FYyghMSk6KHRoaXMuS2E9dGhpcy5pc0VuYWJsZWQ9CiExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpLHRoaXMuSWIoKSl9LEVjOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O2lmKGEpe3ZhciBiPW5ldyB5KHRoaXMuRGQoKSksZD10aGlzLmxhKHRoaXMuWmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHkodGhpcy5aYit0aGlzLmFlKCJjdXN0b21lciIpKTt0aGlzLk1hKGIsdGhpcy5QdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kZigiY3VzdG9tZXIiKTthP3RoaXMuemw/dGhpcy5rYSgibm9TVk1Db25maWciKToodGhpcy56bD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWMoITApfS5iaW5kKHRoaXMpLAoxMDApKTp0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxQdDpmdW5jdGlvbihhKXtpZighdGhpcy5YKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7aWYoIXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLkJjPSEwO3RoaXMuRWMoITApO3JldHVybn19dGhpcy5OZD10aGlzLmRjKGIuc3RyaWN0KTt0aGlzLnVmPXRoaXMuZGMoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMucGc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLndjPXRoaXMuZGMoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmRjKGIuZW5hYmxlZCk7dGhpcy5hYz1iLnRlc3RoaWRlfHwiIjt0aGlzLmNjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGQ9Yi50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLnJjPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMudWI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnFjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5lZT1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5kaD1iLmpzcG9wdXBzfHwhMTt0aGlzLkdiPWIuc2lkZWxvYWRzfHwhMTt0aGlzLmdjPWIudnBhaWR8fCExO3RoaXMuYWIudnBhaWQ9dGhpcy5nYzt0aGlzLkZoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuYWQ9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLmNpPWIudm1hcHN8fCIiO3RoaXMuJGM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLlFhPWIuYml0cmF0ZXx8MUUzO3RoaXMuTWY9Yi5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuJGI9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy4kcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMubGUmJih0aGlzLiRiPW51bGwpO3RoaXMucWY9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmIudmlkZW9wbGF6YXx8e307IXRoaXMuQmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkJjPSEwLHRoaXMuRWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuYnUoKSYmKHRoaXMuYWN8fHRoaXMuY2N8fHRoaXMuYmN8fHRoaXMuJGJ8fHRoaXMuTGQpP3RoaXMuWmU/KHRoaXMuS2E9dGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5uYih0aGlzLktiKSksdGhpcy5pZSgpLHRoaXMuSWIoKSk6dGhpcy5UdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlV0KCkpfX0sVHQ6ZnVuY3Rpb24oKXt0aGlzLlN0KCk7dGhpcy5WdCgpfSxWdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBiPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5iYSgxMCksZz1lLmJhKDEwKSxIPWUuYmEoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEgsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmEoSCkrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2EoZykrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UudmIoYShjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChhKXt9aWYoMyE9ZCl7dmFyIGM9ZS52YygpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuTGEoKSl7aWYodGhpcy5hYiYmdGhpcy5hYi5wbGF5ZXImJnRoaXMuYWIucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYiwhMCk7CnJldHVybn10aGlzLmthKCJjc3BfIitiKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxVdDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpO3RoaXMuSWIoKX0sTWM6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMDt0aGlzLlh8fCh0aGlzLlg9dGhpcy5LYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIoYSkpLHRoaXMuSWIoKSx0aGlzLmllKCkpfSxTdDpmdW5jdGlvbigpe2lmKHRoaXMuYWMpe3ZhciBhPWUudmMoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLmJoKCkpdGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5hYyk7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLmFjKTsKYi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBkPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWR9Y2F0Y2goZil7fWE/dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5OaCgpfX1lbHNlIHRoaXMuTmgoKX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRWIoKSk7dGhpcy5ZdChmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMubWYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk1jKHRoaXMuaWMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYoKHRoaXMuYmM9dGhpcy5MZCkmJnRoaXMuYmMubGVuZ3RoKXt2YXIgZD10aGlzLmJjLnNsaWNlKCksZj0iIjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWYoKX0sWXQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtjKCkmJmIoKX1mdW5jdGlvbiBjKCl7cmV0dXJuIGU/KHdpbmRvdy5jbGVhclRpbWVvdXQoZSksITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuTWEobmV3IHkoYSksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LE5oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkViKCkpO3RoaXMuWnQoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLk1oLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5NYyh0aGlzLmljLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciKwpmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5jYyYmdGhpcy5jYy5sZW5ndGgpe3ZhciBkPXRoaXMuY2Muc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5NaCgpfSxadDpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGMoKXtlKCkmJmQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGc/KHdpbmRvdy5jbGVhclRpbWVvdXQoZyksITApOiExfXZhciBnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGQpe2Q9PWEmJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmMpfWNhdGNoKGwpe2YoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy4kYj8odGhpcy5wZisrLHRoaXMuTWEobmV3IHkodGhpcy4kYiksdGhpcy5SdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5uZigiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLktoKCl9LG5mOmZ1bmN0aW9uKGEpe3RoaXMuTWModGhpcy5EZiwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LFJ0OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLnBmP3RoaXMubWYoKTp0aGlzLm5mKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5LaCgpOnRoaXMubmYoIkFBQSIpfSxLaDpmdW5jdGlvbigpe3RoaXMuWD0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubmIodGhpcy5LYikpOwp0aGlzLkliKCk7dGhpcy5pZSgpfSxiaDpmdW5jdGlvbigpe3JldHVybiAwPD1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigibmF0aXZlIGNvZGUiKSYmLTE9PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJhZGRFdmVudExpc3RlbmVyIil9LEliOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLkxhKCkmJihhPSIxIil9Y2F0Y2goZCl7YT0yfXRoaXMuUWMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApOyIxIj09PWImJihlLkJhKCJ0LW9ubGluZS5kZSIpfHxlLkJhKCJnaWdhLmRlIil8fGUuQmEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuYmgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm5iKHRoaXMuRWYpKTt0aGlzLk9kJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuT2QmJnRoaXMuT2QoKX0sYW86ZnVuY3Rpb24oKXtpZih0aGlzLnVmJiYKdGhpcy5rcSgpKXt2YXIgYT10aGlzLlFwKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxSaDpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goYil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LE1hOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnRkfHwodGhpcy50ZD0wKTt0aGlzLnRkKys7dGhpcy50ZD50aGlzLkxnJiYhdGhpcy5NZyYmKHRoaXMuTWc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLkxnLCEwKSk7YT1uZXcgTmEoYSxiLGQpO2YmJihhLmdpPSEwKTtjJiZlLldxKCkmJihhLnhnPSEwKTtnJiYoYS5KaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxlZzpmdW5jdGlvbigpe2UuTGEoKXx8ZS5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMua2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMuRGMoKXx8KGE9dGhpcy5sYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PQplLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmthKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmthKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxRdDpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5jaX0sJG46ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLHRoaXMueXUuYmluZCh0aGlzKSx0aGlzLnh1LmJpbmQodGhpcykpfSx5dTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubXAoKX0seHU6ZnVuY3Rpb24oKXt9LG1wOmZ1bmN0aW9uKCl7ZS54YyhrLmxwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmthKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxpZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLkdiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuR2IubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuR2JbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuWWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBkPW5ldyBKO3dpbmRvd1tkLmlhKCldPXRoaXM7ZS5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxidTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnFmfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sRWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxkYzpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx2YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsZSxnLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sbGE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sRWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZD0iIixoLGM7Zm9yKGg9NzswPD1oO2gtLSljPWE+Pj40KmgmMTUsZCs9Yy50b1N0cmluZygxNik7cmV0dXJuIGR9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsZT1BcnJheSg4MCksZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLHAscSx0LHUsdjtwPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih3LnB1c2goZik7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKHA+Pj4yOSk7dy5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO3A9aztxPWw7dD1tO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfH5wJnQpK3UrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTQwOzU5Pj1mO2YrKyl2PWQoYyw1KSsocCZxfHAmdHxxJnQpK3UrZVtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtmb3IoZj02MDs3OT49ZjtmKyspdj1kKGMsNSkrKHBecV50KSt1K2VbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrcCY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLkRqfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Jbj10aGlzLmFbMTBdO3RoaXMuYnM9dGhpcy5hWzJdO3RoaXMuTmo9CnRoaXMuYVs1XTt0aGlzLkdvPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmRyPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jbjp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnM6dGhpcy5NaihhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLmRyfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5Ibig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlphPWEuZi5PKCk6dGhpcy5aYT0iIjsKYS5mLlNnJiZhLmYuU2coe3BhdXNlOnRoaXMuemQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy56aC5iaW5kKHRoaXMpLG11dGU6dGhpcy5OZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnN1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuaGI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5QYj10aGlzLlpjPSExO3RoaXMuQ249MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnlhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmxiKCJuZXdCaWdBZElkIik7dGhpcy5Vbj1lLmJhKDEwKTt0aGlzLmpmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJgoodGhpcy5VbT1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLlFlPXRoaXMuSWQ9ITE7dGhpcy5naD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuVmM9ITE7dGhpcy5VaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlViPSExO3RoaXMudG89ZS5iYSgxMCk7dGhpcy5EYj1lLmJhKDEwKTt0aGlzLkJiPWUuYmEoMTApO3RoaXMuR2g9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMudWM9dGhpcy5DYj0hMTt0aGlzLm9lPW51bGw7dGhpcy5SZD10aGlzLkpiPXRoaXMuemU9dGhpcy5WZT10aGlzLmtlPXRoaXMuamQ9dGhpcy5sZj10aGlzLnBiPXRoaXMuaGM9dGhpcy5vaD10aGlzLnljPXRoaXMuZXU9dGhpcy5zYj0hMTt0aGlzLm1jPVtdO3RoaXMuZWM9e307dGhpcy5yZj0hMTt0aGlzLldiPXt9O3RoaXMuQXM9MjAwO3RoaXMuQWY9dGhpcy5maT10aGlzLmZlPXRoaXMuWWU9ITF9CmMueGo9YjtiLnByb3RvdHlwZT17cXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5aYV0mJnRoaXMuY29uZlt0aGlzLlphXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuWmFdW2FdKTtyZXR1cm4gYn0sU2g6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuVGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5NbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxJZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnNiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuamYrKyxlLmxiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYW8oKSxjPQpsLmdldENvbmZpZygpLHRoaXMuTC5LYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5TaCgpLG5ldyBUKHRoaXMsYSx0aGlzLmdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5RYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5nYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlNoKCksbmV3IFQodGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuZ2MsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlFhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6CnRoaXMuUmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuSWUoYSxiLGQpfSw1MCl9fSxUZTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApOyJzcGllZ2VsLmRlIiE9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8dGhpcy5RZXx8InN2bXByZXZpZXciIT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5SZD10aGlzLkpiPXRoaXMueWM9ITEsdGhpcy5jPWEsdGhpcy5DdCh0aGlzLmMpLHRoaXMuSGcoYSksdGhpcy5tYz10aGlzLnpnKGEpLHRoaXMuZWM9e30sdGhpcy5yZj0hMSx0aGlzLm9vKCkpOnRoaXMuaGQoKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy5jcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJgooYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnpnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuTHAoYSkpKTtyZXR1cm4gY30sTHA6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGNxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksCmUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5pYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLldhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJgooYj1hLm1kLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuT2MuY29kZTpiPT1GLlVkLmNvZGU/ZS52KGsuU3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5KZSgpLGI9PUYuSGYuY29kZSYmZS52KGsuS3IsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsua3AsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkZmLmNvZGU6ZS52KGsuenUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LklmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsuWXUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiOwpicmVhaztjYXNlIHcuVmQuY29kZTplLnYoay5ldix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuVGQuY29kZTplLnYoay5Mcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnVjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLnhhJiYoZCs9Il8iK2EuZXJyb3IueGEpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlJhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5QYS5wb3AoKTt0aGlzLkhlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxDdDpmdW5jdGlvbihhKXt0aGlzLmtlPXRoaXMuemU9dGhpcy5WZT0hMTt0aGlzLnlhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnlhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5ZZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLiR2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmCmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuVW0mJnRoaXMucGxheWVyLnFlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuUG0oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlllJiZiLmxvYWQoKTtpZih0aGlzLk9oKGIpKXt0aGlzLlNtKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5ZZT8KdGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLnBvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy55YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5BdCgpKTp0aGlzLkRlKCk/dGhpcy5EaCgpOnRoaXMuYy5vcmlnaW4ucWcody5UZCl9LEF0OmZ1bmN0aW9uKCl7dGhpcy5wYj10aGlzLmhjPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoZS52KGsuamcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBiPSEwKTtlLmplKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnNhJiYKZS5UbSh0aGlzLmMub3JpZ2luLnNhKTtlLmViKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5waCgpO3RoaXMuYi5LYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuS2MoKTt0aGlzLmVhPXRoaXMueWE9dGhpcy5iLkc7dGhpcy53ZigidnBhaWQiKTtpZih0aGlzLnBiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnZhJiZ0aGlzLmIuZi52YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLmZxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLiRmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5iZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9ClsiZGF0YSJdLm5hbWUmJnRoaXMuYi5UYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5tYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkd1KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuSHUoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSwKdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5DZSh0aGlzLkpiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuVGIoITApLHRoaXMuTHUoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLlB1KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk51KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk91KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUXUoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuTXUoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuZGkoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaWcsdGhpcy5jLkEsCnRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5LdSgpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuJGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5JdSgpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZmkmJih0aGlzLkFmPSExLHRoaXMuWWIoKSksdGhpcy5KdSgpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYiksCjA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5wYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLnBiPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay50Zix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYmUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5iZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpOwp0aGlzLmIuWWYoZnVuY3Rpb24oYSl7ZS5tYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxJdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuaGM9ITB9LEp1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhjPSExfSxMdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LApLdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmViKCJpbXByZXNzaW9uIik7ZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sTnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy55Yz0hMDtlLmViKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuZWIoIm1pZHBvaW50Iik7ZS52KGsuUmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLAp0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuZWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxNdTpmdW5jdGlvbigpe3RoaXMuUGQoKTtlLmViKCJjb21wbGV0ZSIpfSxkaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmViKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmplKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSxHdTpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9CmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoYz1iLm1hdGNoKGQpKT9jLmpvaW4mJihiPWMuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuZWIoImVyciIsYik7ZS52KGsuUnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmRpKCEwKX0sUG06ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5LYSYmYi5pc0VuYWJsZWQmJiFiLkRjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLkJ1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sT2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/CjA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxTbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5haS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnhmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy55Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmFpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnlmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLAp0aGlzLlBkLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWQuYmluZCh0aGlzKSl9LGFpOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy54ZihhKX0uYmluZCh0aGlzKSx0aGlzLkNuKSl9LHhmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk9oKHRoaXMudmlkZW8pJiYhdGhpcy5DYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLkxhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuQXUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5LYygpO3RoaXMuWmgoKTt0aGlzLndmKCk7dGhpcy5hZygpO3RoaXMuYi5waCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5rZigpfX0sa2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5OZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy56ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVmU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmtmKCkpfS5iaW5kKHRoaXMpO3RoaXMuc2UoKS5DaCh0aGlzKX0sUGQ6ZnVuY3Rpb24oKXt0aGlzLkwud2MmJiF0aGlzLkNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5LbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUmEoKX0sUmE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMua2UpaWYodGhpcy5rZT0hMCx0aGlzLlJkfHwoZS52KGsuTnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucmJ8fHRoaXMuYy5rYyl7ZS5sYigibmV3U21hbGxBZElkIik7dGhpcy5qZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnlhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuV2goKX1jYXRjaChnKXt9dGhpcy5sZj0hMDt0aGlzLmIud2UoKTt0aGlzLlViPSExO3RoaXMuc2UoKS55aCgpO3RoaXMuYy5yYiYmdGhpcy5jLm9yaWdpbi5PZSgpO3RoaXMuYy5rYyYmKGE/dGhpcy5jLm9yaWdpbi5raCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LEJ1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5EZSgpP3RoaXMuRGgoKTp0aGlzLlFkKGEpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuRGUoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWN8fHRoaXMuTC5lZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmVnKCkpO3RoaXMuYy5vcmlnaW4ucWcody5UZCl9LHlmOmZ1bmN0aW9uKCl7aWYodGhpcy5ldSl0aGlzLlJhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlZhJiYhdGhpcy5sZiYmdGhpcy5iLmYuVmEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuaHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlJkPSEwO2UudihrLmJpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkNlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmhmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdoKSkmJihkPXRoaXMuYy5oZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucmI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueWEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5XaCgpLHRoaXMuYy5vcmlnaW4uT2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sRGg6ZnVuY3Rpb24oKXt0aGlzLnVjPSEwO3RoaXMueWE9dGhpcy5iLkc7dGhpcy55YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueWEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLllwKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnlhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5LYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueWEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnlhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5aaCgpO3RoaXMud2YoKTt0aGlzLm9lPXNldEludGVydmFsKHRoaXMuWm4uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0sWXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5LYSYmZy5pc0VuYWJsZWQmJiFnLkRjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSxabjpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMub2UpLHRoaXMuUGQoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy55ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5vZSksCnRoaXMuUWQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxUaDpmdW5jdGlvbigpe3RoaXMub2h8fCh0aGlzLm9oPSEwLHRoaXMueWN8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxodTpmdW5jdGlvbihhKXtlLnYoay4kZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVWh8fHRoaXMuQ2J8fCgwPT1hJiYodGhpcy5zYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zYiksdGhpcy5zYj0hMSksdGhpcy5WZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy56ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcykpLHRoaXMudWMmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkNifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5MYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuUGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudWMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC53YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMueWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlJmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwud2MmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5WZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlVoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkNiKXt0cnl7aWYodGhpcy5lY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmVjLmltcHJlc3Npb24mJnRoaXMuZWMuY29tcGxldGUmJiF0aGlzLnJmKXt0aGlzLnJmPQohMDt2YXIgZD10aGlzLmVjLmNvbXBsZXRlLXRoaXMuZWMuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy5lcSh0aGlzLmMuUGEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmZlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuVXEobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5IZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLkxtLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5IZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLlBhPXRoaXMueG8odGhpcy5jLlBhLGEpfWNhdGNoKHIpe319fSxIZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC56YShhKSxkJiZiLk9tKGQpLGN8fChjPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuUW0oYSksdGhpcy5MLk1hKGIsZnVuY3Rpb24oKXt0aGlzLnhoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LFFtOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx4aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxvbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxMdDpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSxlcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHhvOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEF1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy4kaC5iaW5kKHRoaXMpKX0sJGg6ZnVuY3Rpb24oKXtlLkxhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLlliKCk6dGhpcy5jLk9iJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksCiF0aGlzLnljJiZlLkxhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLk1wKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5PYn1jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmMuT2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxaaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5hZCYmKGI9dGhpcy5MLmFkKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnhiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmVhLmFwcGVuZENoaWxkKGEpfX0seGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkdkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuYWQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx3ZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMudG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuRGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5RaC5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLlBoLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUGguYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuWWIoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy55YigpO3RoaXMueGIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkJiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuZ3UuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkdoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jLmhmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoZyk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkxhKCl8fCh0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLlliKCk7dGhpcy5HZCgpfS5iaW5kKHRoaXMpKSx0aGlzLmVhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMueWIoKTt0aGlzLnhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZWEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLmVhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5ZZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi52YSYmdGhpcy5iLmYudmEoKSYmKGUudihrLmpnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5OZSgpKTt0aGlzLnliKCl9fSx5YjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFliOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLkFmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxQaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSkpfSxRaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuaGM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmhjPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy55YigpLHRoaXMueGIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmhjPSEwKX0semQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5CYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxndTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMucGI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksCnRoaXMucGI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucGI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkJiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxzdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LFhiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuWGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLlhiKTt0aGlzLmpkfHx0aGlzLlZjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5rZigpKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUudmMoKTtpZighdGhpcy5MLmdjfHwKZS5MYSgpfHwhYy5pc0Nocm9tZSYmIWMuaXNGaXJlZm94fHxjLmlzRWRnZXx8IShhfHwhdGhpcy5mZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5RZSlpZih0aGlzLmpkPSEwLHRoaXMuc2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuc2IpLHRoaXMuc2I9ITEpLCgicHJlcm9sbCI9PWUuVGEmJnRoaXMuVmN8fCJwb3N0cm9sbCI9PWUuVGEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKWlmKGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCwiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlRhKSksInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IoYj10aGlzLmIuRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLktjKCk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMua2QoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5RZT10aGlzLmZpPXRoaXMuQWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmZlPQohMCxhPWUuJGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuSWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KX0sa2Q6ZnVuY3Rpb24oYSl7dGhpcy5MdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2QoITApfS5iaW5kKHRoaXMpLHRoaXMuQXMpOih0aGlzLmxmPSEwLHRoaXMuYi53ZSgpLHRoaXMuYi5ldCgpLHRoaXMuVWI9ITEsZS52KGsuc28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnNlKCkueWgoKSl9LHNlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiYKbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LGFnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IYSgibWluVmlzIik7YSYmKGUuQmUodGhpcy52aWRlbyxhKT90aGlzLnpoKCk6dGhpcy56ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk9iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLnJiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMubWMmJjA8dGhpcy5tYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMubWMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTsKcmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLlVuKyItIit0aGlzLmpmO3RoaXMuYyYmdGhpcy5jLkRnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy5EZygpKTtyZXR1cm4gYX0sb2c6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnhqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Scj10aGlzLmFbOF07dGhpcy5VbD10aGlzLmFbMV07dGhpcy5vaj10aGlzLmFbN107dGhpcy5pbT10aGlzLmFbM107dGhpcy5EcT10aGlzLmFbNV07dGhpcy5Iaj10aGlzLmFbNl07dGhpcy5pdD10aGlzLmFbNV07dGhpcy5Xbz10aGlzLmFbOF07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5ycT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs1XX1jLnVqPWI7Yi5wcm90b3R5cGU9e1FyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ScjoKdGhpcy5UbChhKX0sVGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVsOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vajp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaW06dGhpcy5DcShhKX0sQ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRxOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Iajp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXQ6dGhpcy5WbyhhKX0sVm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldvOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kdTp0aGlzLnFxKGEpfSxxcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucnE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBSYT1jLnVqfHxSYSx3Yz1uZXcgUmEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuUXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmxjPXRoaXMubmM9ITE7dGhpcy5zYT0iIjt0aGlzLnpmPSExO2QmJmQuZW1wdHk/dGhpcy52cignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnZjKCksYjtiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9CiEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnphKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5MYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2Upe2E9ZS5sZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIikpMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil8fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmCjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwuemEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC56YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5NYShiLHRoaXMudXIuYmluZCh0aGlzKSx0aGlzLnJyLmJpbmQodGhpcykpfSxBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoPwpbXTpbXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRWEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlRhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYKKGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5UYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuVGF8fHRoaXMuWXEoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuUXQoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgaD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sWXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJgooMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSx1cjpmdW5jdGlvbihhKXt0aGlzLlVzKGEpO3RyeXt0aGlzLkVhPWEucmVzcG9uc2VYTUwsdGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5TYSh3LlZkKSl9dGhpcy5XPXRoaXMuQWcoKTt0aGlzLm5jPXRoaXMub2YoKTt0aGlzLmxjPXRoaXMuTGgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuU2Eody5PYyx7ZXJyb3I6dGhpcy56Zj9GLlVkOkYuR2Z9KSl9LHZyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkVhfHwKKHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlNhKHcuVmQpKX10aGlzLlc9dGhpcy5BZygpO3RoaXMubmM9dGhpcy5vZigpO3RoaXMubGM9dGhpcy5MaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5HYygpOnRoaXMub2EodGhpcy5TYSh3Lk9jLHtlcnJvcjp0aGlzLnpmP0YuVWQ6Ri5HZn0pKX0scnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuU2Eody5GZix7ZGVwdGg6YX0pKX0sR2M6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy4kcSgpP3RoaXMuJHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5JZygpLGgse0FkU3lzdGVtOnRoaXMuS3AoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5vYSh0aGlzLlNhKHcuSWYpKTooYT0wLHRoaXMudnUoKSYmdGhpcy5UZSh0aGlzLnVvKCkpKX0sT2U6ZnVuY3Rpb24oKXt0aGlzLm5jPyh0aGlzLm5jPTE8dGhpcy5XLmxlbmd0aCwKdGhpcy5XLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5PZSgpfSxraDpmdW5jdGlvbigpe3RoaXMubGM/KHRoaXMubGM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuR2MoKSk6dGhpcy5wYXJlbnQua2goKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YdCgpP3RoaXMuV3QoKT8hMDooLTEhPXRoaXMuemMoKT90aGlzLm9hKHRoaXMuU2Eody5CZikpOnRoaXMub2EodGhpcy5TYSh3Lk9pKSksITEpOih0aGlzLm9hKHRoaXMuU2Eody5PYyxGLkhmKSksITEpfSxUZTpmdW5jdGlvbihhKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5QYT1hLlBhLmNvbmNhdCh0aGlzLktlKCkpO2EucmI9YS5yYj9hLnJiOnRoaXMubmM7YS5rYz1hLmtjP2Eua2M6dGhpcy5sYzthLldhPWEuV2E/YS5XYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuVGUoYSl9LHVvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhOwp0aGlzLnNhfHwodGhpcy5zYT0iIik7YS5kdXJhdGlvbj10aGlzLnpjKCk7YS5NPXRoaXMuRmcoKTthLk9iPXRoaXMuTnAoKTthLmR3PVtdO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuSnAoKTthLmhmPXRoaXMuYnEoYS5kdXJhdGlvbik7YS5XYT1hLldhP2EuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3JldHVybiBhfSxvYTpmdW5jdGlvbihiKXt0aGlzLnNhfHwodGhpcy5zYT0iIik7Yi5XYT1iLldhP2IuV2E6LTEhPXRoaXMuc2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLndnO3RoaXMuVSYmKGIuUGE9Yi5lcnJvci5jb2RlIT13LkJmLmNvZGU/Yi5QYS5jb25jYXQodGhpcy5PcCgpKTpiLlBhLmNvbmNhdCh0aGlzLldwKCkpKTt0aGlzLlcubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuUWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5RYiYmdGhpcy5wYXJlbnQuUWIoYiksCmE9MCx0aGlzLkdjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQub2EmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5vYSYmdGhpcy5wYXJlbnQub2EoYiksYT0wKX0sUWI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuUWIoYSl9LHFnOmZ1bmN0aW9uKGEsYil7dGhpcy5vYSh0aGlzLlNhKGEsYikpfSxTYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBUYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LCR0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8aH0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkZnKCkubGVuZ3RofSxXdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuemMoKX0sb2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlcuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxMaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuVyYmCjI8PXRoaXMuVy5sZW5ndGgmJiF0aGlzLm9mKCkmJihhPSEwKTtyZXR1cm4gYX0sVXM6ZnVuY3Rpb24oYSl7dGhpcy5zYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLnNhPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMuc2E9IlVOS05PV04ifXRyeXt0aGlzLnpmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LCRxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5JZygpLmxlbmd0aH0sSWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxLcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlKHRoaXMuVSwiQWRTeXN0ZW0iKX0sS2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuVmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuaWIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLlZnKGEucGFyZW50Tm9kZSk6ITF9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LE9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5LZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxOcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmliKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKRmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxRYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksR3Y6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuaWIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuUWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LEpwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMucWQoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuaWIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sYnE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5KdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LHJlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5pYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucWQoYSk6IiJ9LHFkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLnVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5hbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaT10aGlzLmFbN107dGhpcy5Maj10aGlzLmFbMTBdO3RoaXMuWW09dGhpcy5hWzFdO3RoaXMuVmk9dGhpcy5hWzZdO3RoaXMuSmo9dGhpcy5hWzddO3RoaXMueWk9dGhpcy5hWzVdO3RoaXMuRHA9dGhpcy5hWzJdO3RoaXMuVHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbM119Yy55bz1iO2IucHJvdG90eXBlPXt6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5LaihhKX0sS2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxqOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ZbTp0aGlzLlVpKGEpfSwKVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlZpOnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Kajp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueWk6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkRwOnRoaXMuU3IoYSl9LFNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ucjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLnlvfHxVYSx4Yz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy56aSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLlBhPVtdO3RoaXMuTT1bXTt0aGlzLk9iPSIiO3RoaXMuQT10aGlzLmtjPXRoaXMucmI9ITE7CnRoaXMueGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLnllPSIifWMuaWw9YjtiLnByb3RvdHlwZT17cG86ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sVXA6ZnVuY3Rpb24oKXtpZighdGhpcy54ZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnhlPWFbY10pfXJldHVybiB0aGlzLnhlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueWUpcmV0dXJuIHRoaXMueWU7dmFyIGE9IiI7KGE9dGhpcy5VcCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7CnJldHVybiB0aGlzLnllPWF9LGZxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0KdGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5pbHx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuVG49dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5WdT1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHI6dGhpcy5TbihhKX0sU246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRuOnRoaXMuRnQoYSl9LEZ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuVnV8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD15Yy5Hcig0KTt2YXIgdz17VmQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIseGE6IlhNTF9QQVJTRV9FUlJPUiJ9LE9pOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix4YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIseGE6IkVNUFRZX1ZBU1QifSxJZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKeGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHhhOiJMT0FEX0VSUk9SIn0sVGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHhhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnh2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHhhOiJNRURJQUZJTEVfRVJST1IifSxCZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix4YToiRFVNTVlfQUQifX0sRj17R2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix4YToiTk9fQURTIn0sSGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHhhOiJOT19NRURJQUZJTEVTIn0seXY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIseGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxVZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix4YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWXI9dGhpcy5hWzNdO3RoaXMuS2s9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzVdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLnZ2PXRoaXMuYVsyXTt0aGlzLkduPXRoaXMuYVsxMF07dGhpcy5hcD10aGlzLmFbMl07dGhpcy5Uaj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLmVrPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Zcjp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuS2s6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFvOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zbjp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnY6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkduOnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hcDp0aGlzLlNqKGEpfSwKU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5la3x8V2EsemM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuWHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5tZD1iO3RoaXMuUGE9W107dGhpcy5vcmlnaW49bnVsbH1jLmNqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5janx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZmo9dGhpcy5hWzRdO3RoaXMuTW89dGhpcy5hWzJdO3RoaXMueWw9dGhpcy5hWzZdO3RoaXMuV3I9dGhpcy5hWzhdO3RoaXMucWw9dGhpcy5hWzVdOwp0aGlzLkppPXRoaXMuYVs5XTt0aGlzLkZqPXRoaXMuYVszXTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLmhvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVszXX1jLnB1PWI7Yi5wcm90b3R5cGU9e2VqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5majp0aGlzLkxvKGEpfSxMbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTW86dGhpcy54bChhKX0seGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bDp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaTp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmo6dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55cDp0aGlzLmZvKGEpfSxmbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWGE9Yy5wdXx8WGEsQWM9bmV3IFhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZWooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5oYj1hLkJnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmJhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5OYj0KW119Yy5SaT1iO2IucHJvdG90eXBlPXtHcDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGU9MCxiPTAsZz17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZT1iLmxlZnQsYj1iLnRvcCk7Zz17eDplLHk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdwKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5wcShhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLApiKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sT3Q6ZnVuY3Rpb24oKXt0aGlzLlpmPSEwfSxXaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0scGg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5mZCx0aGlzLmYudSgpKX0sZXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwKKHRoaXMuZi5wbGF5KCksZS52KGsuZ2QsdGhpcy5mLnUoKSkpfSxLYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy5mLnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5oYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuaGIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5oYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmhiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaGIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaGIpOwp0aGlzLmYuSWMmJnRoaXMuZi5JYygpP3RoaXMuZi5CZygpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5mLmV4aXRGdWxsc2NyZWVuKCl9LHBxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxxcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7CnJldHVybiBifSxUYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnFwKHRoaXMuaGIpO2lmKGIueCE9dGhpcy5ELnh8fGIueSE9dGhpcy5ELnl8fGIucG9zaXRpb24hPXRoaXMuRC5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5ELndpZHRofHxiLmhlaWdodCE9dGhpcy5ELmhlaWdodHx8YSl7aWYoMDx0aGlzLkQud2lkdGgmJjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMud2UoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkljKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9CmIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuTmIubGVuZ3RoO2ErKyl0aGlzLk5iW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfWUuSGgodGhpcy5HKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5UYi5iaW5kKHRoaXMpLDEwKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5OYnx8KHRoaXMuTmI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLk5iLnB1c2goYSl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuUml8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtPLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPLmlkPWUuYmEoMTApO08uY29udHJvbHM9CiEwO0MucHVzaChPKX12YXIgSz0hMSxkYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLndqPXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLmRrPXRoaXMuYVszXTt0aGlzLlBuPXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzhdfWMuS2k9YjtiLnByb3RvdHlwZT17dmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLndqOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VdTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmRrOnRoaXMuT24oYSl9LE9uOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qbjp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5LaXx8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMudmooNCk7KGZ1bmN0aW9uKGMpe2MuV2s9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuWShhKTt0aGlzLkZkKGIpOwp0aGlzLm1nKCl9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYKITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLklhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYWI9Yy5Xa3x8YWI7KGZ1bmN0aW9uKGMpe2MuVms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWVhKCk7dGhpcy5NYj10aGlzLk1ifHwhMTt0aGlzLlFmPXRoaXMuU2Y9dGhpcy5SZz10aGlzLmRhPXRoaXMuc2Y9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsCiJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMub3AoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuUmcmJnRoaXMuaGcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS56YjthJiZhLlViJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2QoKTt0aGlzLlJnPSEwO3RoaXMuaGcoKX0uYmluZCh0aGlzKSk7dGhpcy5jZygpfSxoZzpmdW5jdGlvbigpe2lmKCF0aGlzLk1iKXt0aGlzLmNkKCk7aWYoIXRoaXMuc2YmJiF0aGlzLmNkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLAoxMDApLCEwO3RoaXMuc2YmJnRoaXMuUWYmJiF0aGlzLlNmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGNnOmZ1bmN0aW9uKCl7aWYodGhpcy5jZCgpKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuU2Y9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5RZj1iLkV2fXRoaXMudWEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LEh2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlV2KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSxYcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxvcDpmdW5jdGlvbihiLGEpe3RoaXMuTWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5NYnx8MzAyPT10aGlzLk1iP3RoaXMuZGE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLk1iKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO3RoaXMuZGE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi5BZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLlhwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuVmt8fGJiOyhmdW5jdGlvbihjKXtjLlhrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sWHE6ZnVuY3Rpb24oKXt3aW5kb3cuT08ubWwuSG0uRm0/d2luZG93Lk9PLm1sLkhtLkZtLkN2KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhxKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlVhPTE1MDA7dmFyIGI9ZWEoKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnRlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIGNiPWMuWGt8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdj10aGlzLmFbOF07dGhpcy5udD10aGlzLmFbNF07dGhpcy5ydj10aGlzLmFbNl07dGhpcy5ndD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs4XX1jLml1PWI7Yi5wcm90b3R5cGU9e252OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wdjp0aGlzLm10KGEpfSxtdDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLm50OnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ3Q6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLml1fHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5udig0KTsoZnVuY3Rpb24oYyl7Yy5GaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSmcoKX0sSmc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxPYTpmdW5jdGlvbigpe3RoaXMudGgoKX0sCnRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRoKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZGc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy50YSgpOnRoaXMubSgpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuZGcoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kZyhhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5FaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuR2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSx3aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLAp0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnBwfHwodGhpcy5wcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMud2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLndoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5HaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU289CnRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzNdfWMuVXI9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWI9Yy5Vcnx8aWIsRGM9bmV3IGliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuUm8oNCk7KGZ1bmN0aW9uKGMpe2MuR2w9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLAoxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sSWM6ZnVuY3Rpb24oKXt2YXIgYj1tO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVj1jLkdsfHxWOyhmdW5jdGlvbihjKXtjLkZsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guV2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwKMjAwKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLlByKGEpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5JKCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LmpxKCl9LFByOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/CiExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnRhKCk7cmV0dXJufX10aGlzLnMoImFkZXJyb3IiLGEpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFc9Yy5GbHx8VzsoZnVuY3Rpb24oYyl7Yy5IbD1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy55ZCYmKGI9ZS56byhiLHRoaXMueWQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVihkKTsKaWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy55ZHx8KHRoaXMueWQ9W10pLHRoaXMueWQucHVzaChiW2FdKSxkPW5ldyBWKGcpLHRoaXMuTihkKXx8KHRoaXMuUChkKSxmPW5ldyBXKGQsdGhpcy5LKSxmLmcoKSl9Y2F0Y2goayl7fX19dGhpcy5SKCl9LFdjOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVtiXXx8KHRoaXMuY2FbYl09e30pO3RoaXMuY2FbYl1bYV18fCh0aGlzLmNhW2JdW2FdPVtdKTt0aGlzLmNhW2JdW2FdLnB1c2goYyl9LGF1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJgohdGhpcy5jYVthXSl0aGlzLkZjfHwodGhpcy5GYz1bXSksdGhpcy5GYy5wdXNoKGIpLHRoaXMuZHQoKSYmKHRoaXMuYWYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuY2FbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2FdW2NdW2RdKGIpfX0sanE6ZnVuY3Rpb24oKXtpZih0aGlzLkZjKWZvcih2YXIgYj0wO2I8dGhpcy5GYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLkZjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNhW2NdW2RdW2VdKGEpfX0sCnZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguYXUoYil9fSl9KShjKTt2YXIgamI9Yy5IbHx8amIseD1uZXcgamIocik7Y2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qcD10aGlzLmFbMl07dGhpcy5zbT10aGlzLmFbN107dGhpcy5wdD10aGlzLmFbNF07dGhpcy5BcD10aGlzLmFbOV07dGhpcy5Jaz10aGlzLmFbNl07dGhpcy5FdD10aGlzLmFbMV07dGhpcy5raj10aGlzLmFbNV07dGhpcy5waz10aGlzLmFbMl07dGhpcy5Sbj10aGlzLmFbMl07dGhpcy5icj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e2lwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qcDp0aGlzLnJtKGEpfSwKcm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5zbTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHQ6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFwOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jazp0aGlzLkR0KGEpfSxEdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRXQ6dGhpcy5qaihhKX0samo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtqOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wazp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUm46dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5Obnx8a2IsRWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLmlwKDQpOyhmdW5jdGlvbihjKXtjLkJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVmE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5CaXx8bGI7KGZ1bmN0aW9uKGMpe2MuQ2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuQ2l8fG1iOyhmdW5jdGlvbihjKXtjLkRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTmEpaWYoYT09dGhpcy5OYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5OYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ydT10aGlzLmFbNl07dGhpcy5ocD10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsyXX1jLmVzPWI7Yi5wcm90b3R5cGU9e3F1OmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMucnU6dGhpcy5ncChhKX0sZ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIHBiPWMuZXN8fHBiLEZjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUZjLnF1KDQpOyhmdW5jdGlvbihjKXtjLk9rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTsKdGhpcy5Ycyh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxYczpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnBhdXNlJiZ0aGlzLmhhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmCnRoaXMuaGEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS51bm11dGUmJnRoaXMuaGEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxTZzpmdW5jdGlvbihiKXt0aGlzLmhhPWJ9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBxYj1jLk9rfHxxYjsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMuZWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZWkmJih0aGlzLkkoKSx0aGlzLmVpPSEwLHRoaXMucmEoKSk7YS5JYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIHJiPWMuTmt8fHJiOyhmdW5jdGlvbihjKXtjLlBrPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgcWIoYltkXSksdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgcmIoYyx0aGlzLkspKS5nKCkpfX1lbHNlIHRoaXMuUigpfX0pfSkoYyk7dmFyIHNiPWMuUGt8fHNiLFg9bmV3IHNiKHIpO1guZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1rPXRoaXMuYVs1XTt0aGlzLnFuPXRoaXMuYVs0XTt0aGlzLmlpPXRoaXMuYVs0XTt0aGlzLmZsPXRoaXMuYVs0XTt0aGlzLnBpPQp0aGlzLmFbMl07dGhpcy5pdj10aGlzLmFbOF07dGhpcy4kaT10aGlzLmFbNF07dGhpcy4kcj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsyXX1jLlpvPWI7Yi5wcm90b3R5cGU9e0xrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Nazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnFuOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5paTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmw6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pdjp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJGk6dGhpcy5acihhKX0sWnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajoKYX19fSkoYyk7dmFyIHRiPWMuWm98fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkxrKDQpOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE9hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZm18fHViOyhmdW5jdGlvbihjKXtjLmVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSwKV3M6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLiRhfHwodGhpcy4kYT1bXSk7dGhpcy4kYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMudGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLldzKHRoaXMuQWEpOih0aGlzLkFhPQp0aGlzLlJiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5vYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy4kYSYmdGhpcy4kYS5sZW5ndGgmJjE8dGhpcy4kYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLiRhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLiRhW2FdJiYzMDMhPXRoaXMuJGFbYV0mJjQwMyE9dGhpcy4kYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMudGEoKTtlbHNle3RoaXMuSSgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZW18fHZiOyhmdW5jdGlvbihjKXtjLmdtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCmc6ZnVuY3Rpb24oKXt0aGlzLlVhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMuZ218fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5FbT10aGlzLmFbMV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLnlrPWI7Yi5wcm90b3R5cGU9e0RtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW06dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVwOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHliPWMueWt8fHliLEhjPW5ldyB5YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUhjLkRtKDQpOyhmdW5jdGlvbihjKXtjLnZsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5ZKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlVlPSExfSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5OcygpfS5iaW5kKHRoaXMpLDUwMCl9LE5zOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlVlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlVlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEt0OmZ1bmN0aW9uKCl7dGhpcy5VZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMudmx8fHpiOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5mYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy55cj0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZmN8fCh0aGlzLmZjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmZjfHx0aGlzLmZjKyssdGhpcy5mYzw9dGhpcy55cj8odGhpcy5mYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuS3QoKSx0aGlzLkkoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMudWx8fEFiOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBBYihiLHRoaXMuSykpLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIEJiPWMud2x8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcz10aGlzLmFbMl07dGhpcy5tcj10aGlzLmFbOF07dGhpcy5CbT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNl19Yy5jbj1iO2IucHJvdG90eXBlPXtyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1yOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBEYj1jLmNufHxEYixJYz1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5ycyg0KTsoZnVuY3Rpb24oYyl7Yy5zbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LE9hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLnNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5ybD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzsKYSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnFvKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm5yKCk6dGhpcy5nZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMubSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5PZigpfHx0aGlzLm0oITApfSxucjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBkKCk7IWIubmEmJmIuVyYmYi5CdiYmYi5EdiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oKSl9LGdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMudGEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2coKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5JYSgpLmlkLApjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMubmg9YltjXSk7cmV0dXJuIHRoaXMubmh9LFZ2OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG06ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLnBkKCkuYWRzTG9hZGVyP3RoaXMuSSghMCk6dGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMucmx8fEZiOyhmdW5jdGlvbihjKXtjLnRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgRmIoYyx0aGlzLkspKS5nKCkpfXJldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgR2I9Yy50bHx8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLlBzPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuZ3I9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLklwOnRoaXMuT3MoYSl9LE9zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIEliPWMuZ3J8fEliLEpjPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPQpKYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy53az11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LFR2OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5TYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEljOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWT0KYy53a3x8WTsoZnVuY3Rpb24oYyl7Yy52az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLldlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuV2UmJmIhPXRoaXMuV2V8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS5CYSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuWHYpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5zKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy52a3x8WjsoZnVuY3Rpb24oYyl7Yy54az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBZKGIpLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBaKGIsdGhpcy5LKSxiLmcoKSl9ZWxzZSBpZihiPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuYWYoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy54a3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ubj10aGlzLmFbM107dGhpcy5qbj10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbM107dGhpcy56bj10aGlzLmFbNl07dGhpcy5Fbz10aGlzLmFbNF07dGhpcy5Dbz10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbMl07dGhpcy5pcT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVsyXX1jLnRzPWI7Yi5wcm90b3R5cGU9e21uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ubjoKdGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuWWooYSl9LFlqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5aajp0aGlzLnluKGEpfSx5bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuem46dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVvOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbzp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMua2s6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLmhxKGEpfSxocTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBMYj1jLnRzfHxMYixLYz1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MubW4oNCk7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT1hLnBhcmVudE5vZGU7YnJlYWt9YT1hLnBhcmVudE5vZGV9dGhpcy5aKGIpO3RoaXMuWShhKTt0aGlzLlNkPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCl7aWYoImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSl0cnl7d2luZG93LkRMOF9vbkFkQ29tcGxldGVkKCksdGhpcy5TZD0hMX1jYXRjaChiKXt9aWYoImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuU2R8fCh0aGlzLlNkPQohMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgTWI9Yy51bXx8TWI7KGZ1bmN0aW9uKGMpe2MudG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWXM6ZnVuY3Rpb24oYil7YiYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLApiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKSk7YiYmYi5hZGRBZEVycm9yTGlzdGVuZXImJmIuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpfSxiZDpmdW5jdGlvbihiKXt2YXIgYT0Ke307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMucygibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LExmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9MDtiPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2IrKyl0aGlzLmJkKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYl0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5MZi5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oKXt3aW5kb3cuX19kbDhfYWRzTG9hZGVyJiZ0aGlzLllzKHdpbmRvdy5fX2RsOF9hZHNMb2FkZXIpOwp0aGlzLkxmKCl9LG06ZnVuY3Rpb24oYil7dGhpcy5Wcz90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oKXt0aGlzLlZzPSEwfX0pfSkoYyk7dmFyIE5iPWMudG18fE5iOyhmdW5jdGlvbihjKXtjLnZtPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IE5iKGIsdGhpcy5LKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMudm18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm91PXRoaXMuYVs5XTt0aGlzLlBxPXRoaXMuYVs5XTt0aGlzLkVsPXRoaXMuYVsxMF07dGhpcy5pcj10aGlzLmFbN107dGhpcy5ZaT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5Yaj1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuT3EoYSl9LE9xOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5QcTp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRWw6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmlyOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ZaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFFiPWMuWGp8fFFiLExjPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1MYy5udSg0KTsoZnVuY3Rpb24oYyl7Yy5QbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnJoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuSXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9ZWxzZSB0aGlzLnBhKCl9LGJ3OmZ1bmN0aW9uKCl7fSx2YTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sVmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Jcn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxPYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5NZChiKX0uYmluZCh0aGlzKSl9LApNZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5yaCYmKHRoaXMucmg9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgUD1jLlBsfHxQOyhmdW5jdGlvbihjKXtjLk9sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5wZSlpZih0aGlzLkFifHwodGhpcy5BYj0wKSx0aGlzLkFiKyssMTU8dGhpcy5BYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuenQoKTp0aGlzLm0oITApLCEwO3RoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubSgpOnRoaXMubSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLnBlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmRhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlQpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LApnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5zKCJhZGVycm9yIixhKSk6Yi5zKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkRhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBRPWMuT2x8fFE7KGZ1bmN0aW9uKGMpe2MuUWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuVWE9LTF9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBQKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgUCh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5hZigpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFJiPWMuUWx8fFJiLFNiPW5ldyBSYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Cbj0KdGhpcy5hWzhdO3RoaXMuSW89dGhpcy5hWzZdO3RoaXMueXE9dGhpcy5hWzJdO3RoaXMubnM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzEwXTt0aGlzLm11PXRoaXMuYVs5XTt0aGlzLk5pPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzFdfWMuanY9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJuOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueXE6dGhpcy5tcyhhKX0sbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm5zOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy51dTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubXU6dGhpcy5NaShhKX0sTWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk5pOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuanZ8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU1jLkFuKDQpOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7CnZhciBhYT1jLm1rfHxhYTsoZnVuY3Rpb24oYyl7Yy5saz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5kYT10aGlzLkNjPXRoaXMuQWE9dGhpcy5ZYz0hMTt0aGlzLnZoPWUuRWIoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLm9iKCksITA7dGhpcy5PZysrO2lmKDEwPHRoaXMuT2cpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6CnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxvYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwKMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMucygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LERhOmZ1bmN0aW9uKCl7dGhpcy5kYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYT1jLmxrfHxiYTsoZnVuY3Rpb24oYyl7Yy5uaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJgooYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IGJhKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuUigpfX0pfSkoYyk7dmFyIFViPWMubmt8fFViLFZiPW5ldyBVYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5XbD10aGlzLmFbOV07dGhpcy5taj10aGlzLmFbNl07dGhpcy5idj10aGlzLmFbOF07dGhpcy56bT10aGlzLmFbMV07dGhpcy4kbT10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlduPWI7Yi5wcm90b3R5cGU9e1ZsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5XbDp0aGlzLmxqKGEpfSxsajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWo6dGhpcy5hdihhKX0sYXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56bTp0aGlzLlptKGEpfSwKWm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5Xbnx8V2IsTmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuVmwoNCk7KGZ1bmN0aW9uKGMpe2MucWo9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LE86ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFhiPWMucWp8fFhiOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZnKCl9LGZnOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZyghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgWWI9Yy5wanx8WWI7KGZ1bmN0aW9uKGMpe2Mucmo9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IFhiKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5xYSl7dGhpcy5SKCk7cmV0dXJufWlmKCF0aGlzLk4oYikpe3RoaXMuUChiKTsobmV3IFliKGIsdGhpcy5LKSkuZygpO3RoaXMuUigpO3JldHVybn19dGhpcy5SKCl9fSl9KShjKTt2YXIgWmI9Yy5yanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFpPXRoaXMuYVs3XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLm5tPXRoaXMuYVs5XTt0aGlzLk1uPXRoaXMuYVs1XTt0aGlzLnByPXRoaXMuYVs5XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLnNwPXRoaXMuYVsxXTt0aGlzLndxPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9zPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5RaTp0aGlzLmx2KGEpfSxsdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXY6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5ubTp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTW46dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnByOnRoaXMucWsoYSl9LHFrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5yazp0aGlzLnJwKGEpfSxycDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc3A6dGhpcy52cShhKX0sdnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndxOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5vc3x8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUGkoNCk7KGZ1bmN0aW9uKGMpe2Mua2k9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7CmI/KHRoaXMuWShiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5wYSgpKTp0aGlzLnBhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmtpfHxiYzsoZnVuY3Rpb24oYyl7Yy5qaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmhlKCk7dGhpcy5iZygpfSwKZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sRGE6ZnVuY3Rpb24oKXt0aGlzLmRhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxiZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CmIuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhlLmJpbmQodGhpcyksMTAwKX0saGU6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwoicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5yYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5qaXx8Y2M7KGZ1bmN0aW9uKGMpe2MubGk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxYYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0KMDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5YYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuWGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5saXx8ZGMsZWM9bmV3IGRjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLktuPXRoaXMuYVs0XTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmdzPXRoaXMuYVs4XTt0aGlzLnZzPXRoaXMuYVs2XTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLllvPXRoaXMuYVs4XTt0aGlzLmt1PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMud3M9YjtiLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lbjp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmJuOnRoaXMuZnMoYSl9LGZzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nczp0aGlzLnVzKGEpfSx1czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudnM6dGhpcy5ocyhhKX0saHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpzOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbzp0aGlzLmp1KGEpfSxqdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBmYz1jLndzfHxmYyxQYz1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5Kbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZz10aGlzLmFoPXRoaXMuJGc9ITE7dGhpcy5BZD1bXTt0aGlzLiRlPQp7R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgVmI/bnVsbDpWYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJhP251bGw6QmEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVT9udWxsOlUsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBHYT9udWxsOkdhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHdhP251bGw6d2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNiP251bGw6U2IsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgUGI/bnVsbDpQYixiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygb2I/bnVsbDpvYiwKT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBMYT9udWxsOkxhLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOmVjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBYP251bGw6WH19Yy5rbD1iO2IucHJvdG90eXBlPXtnOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLlpwKGEpOltdLGI7dGhpcy5haD0hMDtpZihhLmxlbmd0aCl7dGhpcy4kZz0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPWFbY10sdGhpcy5BaChiKX1lbHNlIGZvcihjIGluIHRoaXMuJGUpe2lmKHRoaXMuWmcpYnJlYWs7Yj10aGlzLiRlW2NdO3RoaXMudmYoYikmJih0aGlzLkFkLnB1c2goYiksdGhpcy5BaChiKSl9fSx2ZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEgaW5zdGFuY2VvZiBxPyEwOiExfSxacDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZVtjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEFoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxNdDpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdSYmIXRoaXMuJGcpZm9yKHRoaXMuWmc9ITAsYT0wO2E8dGhpcy5BZC5sZW5ndGg7YSsrKXRoaXMuQWRbYV0uSGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BZFthXS5IYil9fX0pKGMpO3ZhciBnYz1jLmtsfHxnYyxOPW5ldyBnYztOLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5CcT10aGlzLmFbMV07dGhpcy5qbz10aGlzLmFbMTBdO3RoaXMuVGk9dGhpcy5hWzddO3RoaXMuQ3I9CnRoaXMuYVsyXTt0aGlzLm5vPXRoaXMuYVs1XTt0aGlzLmR1PXRoaXMuYVsyXTt0aGlzLndpPXRoaXMuYVs0XTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLndwPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm9tPWI7Yi5wcm90b3R5cGU9e0FxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcTp0aGlzLmlvKGEpfSxpbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuam86dGhpcy5TaShhKX0sU2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRpOnRoaXMuQnIoYSl9LEJyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Dcjp0aGlzLm1vKGEpfSxtbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmR1OnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53aTp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnE6dGhpcy52cChhKX0sCnZwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBoYz1jLm9tfHxoYyxRYz1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1RYy5BcSg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueGMoay53dSksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueGMoay5NciksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBSYz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGtjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIFNjPVJjKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS5OcSgpLHtpZDpTY30pfSw1MDApLGphPWUuYmEoMTApO2ZhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ249dGhpcy5hWzldO3RoaXMueXM9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMuWHU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5kaj1iO2IucHJvdG90eXBlPXtmbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ246dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnlzOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NcTp0aGlzLld1KGEpfSxXdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWHU6CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5kanx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuZm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnNoPXRoaXMuY29uZj10aGlzLmpiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWmE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy51aD0hMTt0aGlzLlhlPVtdO2UubGIoIm5ld0FkZGVsaXZlcnkiKX1jLm1pPWI7Yi5wcm90b3R5cGU9e3h0OmZ1bmN0aW9uKGEpe3RoaXMuc2g9YX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlphPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxzdDpmdW5jdGlvbihhKXt0aGlzLmpiPQphfSxydDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlphXSYmdGhpcy5jb25mW3RoaXMuWmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5aYV1bYV0pO3JldHVybiBifSxKYzpmdW5jdGlvbihhLGIpe2UuQmEoIndlbHQuZGUiKSYmZS5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5qYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLlFxKCkpdGhpcy5qYi5sKHRoaXMuamIucmQsdGhpcy5qYi5GYSwKdGhpcy5qYi5aZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmpiLnRjKTtlbHNlIGlmKHRoaXMubHEoKSl0aGlzLmp0KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLk90KCk7bC5leGl0RnVsbHNjcmVlbigpO2UubGIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmpiLGcpO2wucXQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLnhyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuR2UmJihjPQp0aGlzLnBsYXllci5HZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5JZShhLGMsZik7dGhpcy5wbGF5ZXIuQ2gobCl9fSxRcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LEl0OmZ1bmN0aW9uKCl7ZS5sYigicHJlcm9sbCIpO2UuZWYoInByZXJvbGwiKTt2YXIgYT10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkhhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5yZyhhKSk/dGhpcy5KYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmdkLAp0aGlzLnBsYXllci51KCkpKX0sSHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuZWYoInBvc3Ryb2xsIik7ZS5sYigicG9zdHJvbGwiKTt0aGlzLnh0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnJnKGMpKT90aGlzLkpjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYil9cmV0dXJuIGF9LGF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuQnQodGhpcy5IdC5iaW5kKHRoaXMpKTsKdGhpcy5wbGF5ZXIuT2EoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5sYigibWlkcm9sbCIpO2UuZWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5KYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LCRzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIud3QodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5MZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5JdCgpO3RoaXMucGxheWVyLkxlJiZ0aGlzLiRzKCk7dGhpcy5hdCgpfSxidDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMua3YoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxscTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSxqdDpmdW5jdGlvbihhKXt0aGlzLnVoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuU3MuYmluZCh0aGlzKSl9LFNzOmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLlhlLnB1c2goYSk7MD49dGhpcy5DZCYmdGhpcy51aCgpfSx4cjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5YZS5sZW5ndGg7YysrKWI9CnRoaXMuWGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMubWl8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaWs9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy50bj1iO2IucHJvdG90eXBlPXtoazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLnRufHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5oayg0KX0pLmNhbGwoa2FoTWFiaWVxdW9lZ2VSaSxrYWhNYWJpZXF1b2VnZVJpKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.113.38 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.38.113.9.5.clients.your-server.de
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Tue, 24 Sep 2019 09:35:24 GMT
Server
cafe
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
image/gif
Access-Control-Allow-Origin
https://videos.giga.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, must-revalidate
Access-Control-Allow-Credentials
true
X-Homad-Instance
de36-homad-2
X-Homad-Url
https://pubads.g.doubleclick.net/activity
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
42
Expires
Fri, 01 Jan 1990 00:00:00 GMT
usersync
uss.xplosion.de/
42 B
660 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=385e248010686f30324fc61ba2109da3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 24 Sep 2019 09:35:24 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
data
lb100.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb100.s400.meetrics.net/data?/e58qFIOBA/k0FTImvFytFh0FjvFklF9CEyhFukFCvFvzF0lFymBhkF29By4Ay2A52A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA30Az4AwyA23AmjEpkF9xAz4Ay4A30Ax4A44A4mAzpF6lF93Ay4A45BwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA30Az4AwyA23AmhEwkF91Ax3A0zA4wAy2A3mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A5zAx3A3yAw3AxyAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9xAzxAx1A24Ax1AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAw1A43A40Ax4AmjEpkF9xAz4Ay2A1wAwzA2yAzmAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1wAw1A43A40Ax4AmhEwkF91AwwA14A34A0xA4mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25AzxA33AywA53A0BELlnFCLl1FDKq1FKq2FMq3FVWMq4FbUKq6FLkqFK0kyByyAw0Az0A62A35A2wAw6AwyFl0FptFlBF2qoFx1A25AzxA33Ax5AyyA0mExlEl1Bx4Ei4F0BEUkzFKEPBAAAAAgBAB55gAZBAAOA55A55A85B55A58E55A55AGAywAz3AxxAr55gAPODAAAAgBAP55gAPAAAAAAgBAH55gAP0AAAAAAAABWkKAPAAAFAAWkKTl5/APAAAJPAKCABl5/AZAAAOA55A55A85B55A58E55A55AFA0zAy4A2BErl5/AP5DAJPAKCAHl5/APdJAJPAeEAKl5/APyEAJPANNAKl5/APtEAJPAqQAKl5/APsEAJPAWRAKl5/APYOAAZAwSAcAAAASksFhFjAAAAAAAAAAAAEAAAWkKAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA21AwwAz2AyzAGAkpFylFj0FAAAAJAxzAxxA12A4xA1BEKA1wAw1A43A40Ax4AJAylFj0FhuFnsFlBFKA1wAw1A43A40Ax4AKA1wAw1A43A40Ax4AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAKCAsEA6DAFAAAl5/AAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF/sMAYA
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

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:24 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:23 GMT
data
dc546.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc546.s79.research.de.com/data?/d9yfEOOBALl1FDKq1FKq2FMq3FVWMq4FbUKq6FK2mFLkqFK+kyBoyyAw0Az0A62A35A2wAw6AwyFl0FptFl6BwhFnlFfpFtwFylFzzFpvFufFpkF2qoFx1A25AzxA33Ax5AyyA0mExlEl1Bx4Ei4F0BEUkzFDDPlJAJPAmDAKOxYAPAAA/EAOGAKj9pAPfBAJPAEGABIQSAPQDAJPA4MAKIQSAPAAAJPA4MAKOxYAPBAA/EAgPAKj9pAPuEAJPAjQAKIQSAPBAAJPAjQAKOxYAPAAA/EALTAKj9pAPsEAJPAWRAKIQSAPAAAJPAWRAKOxYAPAAA/EA+TAKj9pAP1OAAZAwSAcAAAASksFPBdJPAEGAsEA6DAAAAAIQSAAAQAOPFfTFPVFSDFFfFx1A20A1xACANSFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFH05oSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.110.202 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h546.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:25 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 24-Sep-19 09:35:24 GMT
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1569317729624&__it=-120&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 24 Sep 2019 09:35:29 GMT
Last-Modified
Wed, 16 Sep 2009 09:33:52 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Tue, 18 Sep 2012 09:33:52 GMT

Failed requests

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

Domain
inventory.cliipa.com
URL
https://inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a68ceacaf6e230004eddda8/5a68ceacaf6e230004eddda8.mp4

Verdicts & Comments Add Verdict or Comment

332 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| onformdata object| onpointerrawupdate object| smbContext object| LUX object| POST_META object| smbt function| b2serp object| smbadloader function| requirejs function| require function| define string| GoogleAnalyticsObject function| ga function| adLoader object| apstag boolean| smbt_only object| DKUIM_SETTINGS string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED function| st_cookie object| is number| USER_PAGE_COUNT number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| smbVideoService object| pagespeed object| iam_data object| adsbygoogle object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer object| google_js_reporting_queue object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad number| _gfp_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| nativendo_588f272a3e49c_conf boolean| apstagLOADED object| google_tag_manager string| type function| sdibgclick object| _absconfig object| _ecoconf 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 function| setUpAgknTag object| google_optimize function| setImmediate function| clearImmediate 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 function| Goog_AdSense_getAdAdapterInstance boolean| google_osd_loaded boolean| google_onload_fired function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c object| closure_memoize_cache_ object| _econa function| send object| de_meetrics string| preloadType function| _ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| _taboola function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb boolean| google_noFetch object| TRC object| _tblConsole undefined| msg object| _comscore object| gapi object| ___jsl function| webpackJsonpdkuim object| Base64 boolean| dkuimInited function| $ function| jQuery function| isEmpty object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq object| stroeerCore object| confiant function| Goog_AdSense_OsdAdapter function| udm_ object| ns_p object| COMSCORE function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcError function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcJSONify function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam object| params number| trc_debug_level string| trc_article_id object| TRCImpl number| taboola_view_id object| nativendo_588f272a3e49c_map object| containers object| images object| trcManager object| trcRbox object| options string| sdm_ift object| cmTag function| startCMTagMain object| BrandBoosterLoader number| mtrcs_timer function| _slicedToArray function| _extends object| BrandBooster object| bb number| mtrcs_pid function| mtrcs_callReadJavascript object| teadsscript object| teads number| _m6rApiLoaded object| _m6rOnce number| _m6rContainerLoaded function| stroeerCoreConnect object| cp2 boolean| isCmTagFMOnPage string| category function| shuffle object| arrToUse object| travel object| news object| mobilecontent1 object| mobilecontent1_new object| travelmuted object| movietrailersHD object| movietrailersHDmuted object| widescreen object| movietrailerslight object| landscapeHD object| landscapeHDmuted object| blank object| blankblack object| blankblack7 object| blankblack5 object| blankblack_mob object| blankwhiteHDmpg object| blankblack10 object| blankwhite object| blankwhiteHD object| black_loader object| lightweight object| lightweight_single object| lightweight300600 object| bonnier object| home object| lipstick object| shoes object| art object| infiltrator object| glass object| lemurs object| NBAshoes object| Sunglasses object| Hummus object| Short_food object| Short_swim object| Euro_news object| Automoto_TV object| Uzoo object| SmartDuvet object| Tiger object| Chocolate object| Logan object| Jacket object| Bike object| Kanye object| Cancun object| Smartwatch object| Helicopter object| dogshampoo object| icetea object| charger object| blueysmoothie object| ShortContent object| carbsandwich object| pisatower object| Food1 object| Food2 object| Food3 object| Food4 object| Food5 object| Food6 object| Food7 object| Fashion object| Lifestyle1 object| Lifestyle2 object| Technology1 object| Technology2 object| Technology3 object| Entertainment object| Scrambledeggs object| Spinach object| Bub1 object| Pokemon object| style_hacks object| Motorcycle object| IceCracking object| Manatees object| Daiving object| Fishing_Lure object| Shark object| HundredsManatees object| TigerShark object| MandelaPrize object| Bertram35 object| bushfire object| Snow object| Delta object| Wheels object| Yellowfin object| Grip object| Kawasaki object| Yoga object| Cat object| Chickens object| RZR object| bitcoin object| bmw object| wombat object| koala object| Marsupial object| puppy object| bitcoinMuted object| bmwMuted object| Wallabies object| Bunny object| Pumpkins object| Dogs_Stress object| Dogs_Stress_image object| lightweight300600_short object| playlist function| webpackHotUpdate string| vpaidId function| OvaMediaPlayer 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

20 Cookies

Domain/Path Name / Value
.teads.tv/ Name: tt_viewer
Value: 7c5dbec5-4f35-4dd3-9a4d-396d6459deb3
.ih.adscale.de/ Name: tu
Value: 4#2063691472#48~7e3d8ee1b515093347ef82a5009dc890~435921~0~0#101~~435921~435921~1#38~CAESEJMwa6O78F0bqpPlixtQkmw~435921~0~0#39~66dc5d89-dc2e-4e00-8453-c31e06b6ce7e~435921~0~0#40~e4f1d063-edd3-4e1b-ad50-c2839a962b4c~435921~0~0#72~6740168297341974671~435921~0~0#42~654942258624464600~435921~0~0#75~~435921~435921~1#63~XYnjWrlQJsMAAB5bToMAAABC&1174~435921~0~0
.teads.tv/ Name: tt_dar
Value:
.teads.tv/ Name: tt_neustar
Value:
.teads.tv/ Name: tt_liveramp
Value:
.teads.tv/ Name: tt_bluekai
Value:
.doubleclick.net/ Name: IDE
Value: AHWqTUmDKaO9mcrpAtp_uFquuO5bOtNrQOExJlSrhpr07kbq_vq1VC4rjaAv4jRq
.teads.tv/ Name: tt_exelate
Value:
.m6r.eu/ Name: yieldlab
Value: 2019-09-24T09%3A35%3A21.766Z
.m6r.eu/ Name: adx
Value: 2019-09-24T09%3A35%3A21.782Z
.m6r.eu/ Name: appnexus
Value: 2019-09-24T09%3A35%3A21.765Z
.m6r.eu/ Name: id
Value: 445b0eb73f158de8dbed42dc56d2b33c
.adscale.de/ Name: ng
Value: 2#891184006#26155295#41728#d1~1&d9~1&d8~2&d7~1&d2~4&d12~2&d11~0&d4~4&d3~5&d10~4
.giga.de/ Name: __gads
Value: ID=f416d4644b337fd3:T=1569317722:S=ALNI_MYTs_HayfmiSfSWjaGfRPx5AQtLfQ
.adscale.de/ Name: uu
Value: 7f20f7c4d5cf4e4682eee5e5e59f06b7
.teads.tv/ Name: tt_emetriq
Value:
.m6r.eu/ Name: test
Value: true
.teads.tv/ Name: tt_salesforce
Value:
.agkn.com/ Name: ab
Value: 0001%3ARDwM7pIoMtVuT6JMcv63jUTg1YcvAYnX
.m6r.eu/ Name: adscale
Value: 2019-09-24T09%3A35%3A21.660Z

7 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api error URL: https://c.amazon-adsystem.com/aax2/apstag.js(Line 2)
Message:
Error: `apstag.init` was called multiple times
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js(Line 1)
Message:
SDG: ERROR: MEETRICS: OUT-OF-PAGE: minimal information not met. Measurement canceled
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js(Line 1)
Message:
SDG: ERROR: MEETRICS: POSTERAD: minimal information not met. Measurement canceled
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.641b533ee5b9646697c716b44e495547.js(Line 1)
Message:
SDG: ERROR: MEETRICS: SKY: minimal information not met. Measurement canceled
console-api log (Line 108)
Message:
inline_ad: No video available; loading inline-ad by Teads
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta

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.

15.taboola.com
a.teads.tv
aax-eu.amazon-adsystem.com
acdn.adnxs.com
ad.doubleclick.net
ad.yieldlab.net
adscale.nuggad.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
api.theadex.com
api.yieldlove-ad-serving.net
apis.google.com
bbcdn-bbnaut.ibillboard.com
bis.cliipa.com
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.emetriq.de
cdn.m6r.eu
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
cm.smadex.com
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
cx.atdmt.com
d.agkn.com
d.nativendo.de
dc546.s79.research.de.com
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
eu-u.openx.net
files.giga-video.de
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
inventory.cliipa.com
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb100.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.gamona.de
media.oadts.com
native.adscale.de
pagead2.googlesyndication.com
pixel.rubiconproject.com
px.powerlinks.com
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
s79.mxcdn.net
s79.research.de.com
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
server.cliipa.com
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
ssl.3.damoh.giga.de
static.cliipa.com
static.giga.de
sync.teads.tv
t.nativendo.de
t.teads.tv
tpc.googlesyndication.com
tracker-adserver.ibillboard.com
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
video-adserver.ibillboard.com
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.gstatic.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
inventory.cliipa.com
104.109.82.87
107.178.241.34
108.128.71.27
109.71.25.30
13.32.223.253
130.211.13.252
136.243.2.136
144.76.115.247
148.251.84.39
151.101.114.2
151.101.114.49
151.101.13.108
151.101.13.194
151.101.14.2
151.101.14.217
151.101.14.49
161.156.66.178
172.217.16.162
172.217.21.198
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.196.191.159
18.196.229.216
18.196.234.219
184.30.220.71
185.22.221.117
185.33.223.221
188.40.110.202
188.40.16.106
192.132.33.46
193.46.63.75
2.16.122.151
2.18.232.7
2.18.233.67
2.18.234.72
2.19.43.224
2.21.37.179
2001:4de0:ac19::1:b:2a
216.58.205.226
2600:9000:20bb:6400:1c:8c89:a300:93a1
2600:9000:20bb:8a00:15:efbc:e300:93a1
2606:4700:20::6819:ad0d
2a00:1450:4001:806::2002
2a00:1450:4001:809::2001
2a00:1450:4001:814::2002
2a00:1450:4001:815::200e
2a00:1450:4001:819::200e
2a00:1450:4001:81a::200a
2a00:1450:4001:81b::2002
2a00:1450:4001:81b::200a
2a00:1450:4001:81d::2003
2a00:1450:4001:81e::2002
2a02:26f0:6c00:292::2c92
2a02:26f0:6c00:2bc::5f76
2a03:2880:f02d:5:face:b00c:0:8c
2a03:2880:f12d:83:face:b00c:0:25de
34.239.65.48
34.95.120.147
35.156.29.62
40.113.136.100
46.253.113.178
5.9.113.38
52.219.72.199
52.28.148.3
52.28.35.163
52.43.231.55
52.49.153.216
52.94.216.48
54.154.35.6
54.235.243.56
62.168.44.119
62.168.44.125
63.32.86.220
69.16.175.42
69.173.144.165
80.82.201.88
82.149.242.40
89.163.159.100
89.163.159.103
89.163.159.120
91.215.100.40
91.215.103.64
99.84.151.92
99.84.157.237
002309837aa64a1802f6e1101c89fc2a37b7d1d648d965a4b2198717b3f374f8
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
096e7af15d6f5f51291b05a81503d82565a5a1324d2e1cfac8a495760f144baa
0b151fb8a946c68d94b2eff57a704c74251bfc4ca45b7c6a97e5547177126316
0b76290a2c34c33340895083a70110d2c6aa5027d638ea22bf741920bdc39b95
0caf031a9d7aafe97f87fba3be0ebe861e187a75893da0bef95b1c2cadddf137
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
15845f73e9b1a585a2ff66330c607a145fbd745aa367b85af1be26f5d25ccf79
16ba5d501cf510c0f7c702072334dbbe1babbb6cb9e17262db519c4e1659856a
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
1b30318c09de51d9770ea476cc9ed29d076a7bb52e8c97441f30968070e6d70a
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
25cfddb5930c26596981a0215bc7675b1bd4a096a92b705ead424d72741570ab
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
27c74238cbd981ca153723bbd76adbc8dba81e9e6703f6b7312d36d2dd3951c3
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2ce8d6a0b051a9aa7cb5296b3a7597556465c94ea6adba975723976f7bd682d9
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
30b3bf0c9ec03ceeee2b7ac374a183250de077afd73ec6357519445870ebe158
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
38b0293b25c51a1c571a710b02ef7ecb64701c212e8f1eaf131d436dec980a8f
38dae1dd21f62600f343dbf64c64fccd470fde91e5355b77ce27ef2f3ea6a7c7
396bf68eca1ce17182ad5a282b4eac1039766aabac1d446c8b457d558a8ca249
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3a2d4215ea29f3c884ac860a469540231fe161f939da2461195a2b8c0fc6b830
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1
3e519113583c968dd0daa3a70249fc54df7114ba2595bfe1644d2320e6d25aa5
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
40881f2ea8191b832d838358e1577f1dcdcae71ce4277a3d38498e1c8a0e9f05
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
464f66b4c2e5fa054b0a1b576bed2c440da7f23379aabab11e2ff312b8a74f08
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
511c23178d504d371d22fb6899174f448db32523e9cacd2860306a2b3b8cc1f5
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
53c3adf0fadb97ff92b3a406693bb9ec4630b9b0d650ec5437383550380dc875
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
55945c84253b1537f12101e52b67c9c6d3cf0041e132f9fbd6fbec1cbe0eb199
559b21249d6335756699745b380a34a3640802b3963c5a52a5e8dbed9bc4262a
55e0160704ffd59f47564767974aa8cd5bc787702d5fd371d93bab784e65cf67
56d19889571d5a2a2067e879a75c87bee10e25e5dc98472e8a372fd14682302a
57bc7032c0d434b5823f3b8bb57f1fd0996873271ea168c4df9cb1fd918b1d96
57f344220821bc52a0bda077127249ca9c8862221fcfad53cd4e4aa5906852ac
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642
5bef04e02f52ff6896f6bafeedd65fff82e76129f7db11338a590e90da2e57fb
5ccf0af7b33cec4723d8a1d648cb83f9cd3817aff291d9ca4b591ce8d1db137d
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
65355070c60fbbd74428ad9ad389260b8d7231d1750cf20a805d60d693f32614
6716ffc730601787bc2fe3c9aaa5761ff6c3348411c8744f8f2fabb6bea0408c
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6c7ed2d548e889f2bd271cc326596ba4ad529474c3881bf3fcbc39d8d3213706
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
769e8af580cea4d3d9ec3ffae656299666510e1a6f942c791f4feafc9e145021
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
78abe71a42bb77012210193e88b14d5e4ae964d17f45cda0476d280b9379e1bd
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
7c92ffc225aed56f82019862b155c8d84902352620250d029bbf653a3d7eab61
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
85838fca0e7ee704142710df49c3ce62ed2d4dc4b52c3b644ca816608ea08099
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8e920612ce29a3290fc2edbaab7647470f21dda35cc1a350f9b8b362fc4d3ebe
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
91ffef0e08af098862c5ee0b413103869650c929e0a65fbd29e5815e3b402609
95af08216dafc14cd81ed5384e88ea447fef294c2de3bd2a5fa0a3f5e477244f
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
9727c6d01f0396bcd2f3cc25f7540510f6d8174c83275e4642309a9809adc0ac
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9dfd8038d48cd1f5dc20da31883be4c9c122fede4fedecd14900e9378ee4e15e
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a076460215972ba3aff72729a43dc7989ef8a85dba721e287bc9ccefeae3aa0f
a171e8c7a44d294284e2d33393fe6621a29f5e57ee36602ae422de9955dd957c
a29b20518a3bb583278ebb330cba43e072795b7009b39f3479819d00f0833064
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b46c267d43ddeb9cacc7a21e156396e397da01ed724782c3e31c52ab702cda9e
b5fa1ca5f3a828ddd08703cc68600688e03f71751a2ad0bbf5b33f94f22f5cac
b8be8937532d85115f5b4bcdd54632c02e1cfbea2d8164a6d3f4b3917ee06c48
bcd30b8327058ae6bd203eb722b5f9efa10767558494ca0b9177300acaa480e2
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
bd5e2011016dd5e73ac3488dede054932251fc9a5b4f06a65d8ff1d962869136
be701739dbd531e7a05df6dea81b4666d177b2ef14503eba47e7bf220959788d
bf6dfeb55238667742261daf868564936c9c32468d2a3a8e32c8ded0e0627601
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c27c80b3fbae6f823e73d838ca5cae4ca8a2ab20118d42f983056d61e51d5d85
c72d7c1c42a5bbc5f5f0b0056795d38673858d6972688ae0ff9f345cfd5f1f58
c77635c1d346c5471d294f59d0c4ef11f71c21f94e82087cbd99984c9aaa3cda
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
ca3bb49ea990edfb106762228375c35b7070f2eb360aae2f442939a6106252c1
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cd8940c4c63a95072326d6d5f3c996384d0f31874a1541e057b43272bcf29bd5
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d1e63ab0c35177828f3d36617564ffc24333485ee51cb1a55340a3a577741ee8
d50463d8618378a690bc1e1b3de82edef05c4575df03df20cb165d610c394a9c
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d83403588cc6bf8c728659869f5c037d9fd3f51f5db5c7b44adbe2c818e15a55
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc3bd538f2f2905a1f98e5b6fca1977b0b5b66cfc4e7333caed826f7d3148f4f
dc63b17fec954467b897ae2dd23df2b4df42a6dd7b982cae40c238281c88be92
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
dfeedae9c9b83e05b47a24af31e7873037b83174ddcf46e4f65bf4e101172101
e00a937cbb03d2021dda2bf5b1737208599260fe486b2729b96ee027b7d539c9
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3cd4f1f8c496707beb1dd7a37c361bdf81deea0108a3ac762a88038c2a0982a
e686daba37260303bd5dce82de43affbc6fa3474812fe14e8dbb3e8d5e2c3455
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ec52c8556442bbc31b7aa141f1c763077aade898b98e68fb13366bd668fe9349
ed5cd9fd6cd52d4f09b4d30683ce8a45357e5c87dacae6103ba309bc24da5f20
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ee441245ef85f538030acf5e534d1cf2664c18289cec8cc0d84656ffb0e0a95d
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f0931b243e8edbd99694b657e6f050737319039cb96b165b290623f52422c5b0
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f1a50e7c8a1e222f164f802e726bb855301f3e7af5b93760b64d907a65ccee37
f31d00a72b38535ab0e9615410790bdd191ce7247198d172e7dcfd6913dbb70f
f3a7b8903fe69fc8990e0e9b121473a8712fdb366bf58cee84fbe85df26ddc1a
f4189fdfd0fa2ff7bd77fee56e4876e4671e85244d1b183e9788f97a21cf0329
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64
fab9d391acf9bff49f9e7ff91604c13f64507c878d911f662402eecc4345da35
fb829884f8bc67aefe0869ffdba718c066b727623f1fb2ef2b77e12b65fc9621
fc210097c624aab58388cb77889ef8f56a5fdf2192a1ff0df46153bdee5b9ce0
fcfe1e273b77a6901a90e8adf4a68a1ab24f3f6404f96a096ed95b20afe556a1