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 11 via api from US

Summary

This website contacted 86 IPs in 8 countries across 67 domains to perform 286 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.100.39 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
4 178.19.70.100 29551 (HGCOMP-ASN)
5 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)
2 2a03:2880:f11... 32934 (FACEBOOK)
1 2600:9000:20b... 16509 (AMAZON-02)
14 2a00:1450:400... 15169 (GOOGLE)
4 143.204.211.231 16509 (AMAZON-02)
6 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)
3 178.19.72.20 29551 (HGCOMP-ASN)
2 6 104.109.82.87 20940 (AKAMAI-ASN1)
14 2a00:1450:400... 15169 (GOOGLE)
1 143.204.214.67 16509 (AMAZON-02)
1 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 15 72.251.249.9 29791 (VOXEL-DOT...)
3 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
11 136.243.4.14 24940 (HETZNER-AS)
1 15 216.58.206.2 15169 (GOOGLE)
1 178.19.65.130 29551 (HGCOMP-ASN)
2 151.101.13.194 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
5 27 151.101.114.2 54113 (FASTLY)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.216.48 16509 (AMAZON-02)
1 7 2.18.234.72 16625 (AKAMAI-AS)
4 5 185.33.223.216 29990 (ASN-APPNEXUS)
3 69.173.144.143 26667 (RUBICONPR...)
1 3 34.95.120.147 15169 (GOOGLE)
1 185.64.189.112 62713 (AS-PUBMATIC)
1 37.157.4.25 198622 (ADFORM)
3 7 23.43.115.95 20940 (AKAMAI-ASN1)
2 52.219.73.199 16509 (AMAZON-02)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
3 143.204.214.60 16509 (AMAZON-02)
7 185.22.221.117 60955 (WAVECON)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 104.111.246.233 16625 (AKAMAI-AS)
2 37.157.4.40 198622 (ADFORM)
5 2600:9000:20b... 16509 (AMAZON-02)
3 62.168.44.126 5588 (GTSCE GTS...)
2 69.16.175.10 20446 (HIGHWINDS3)
10 151.101.114.49 54113 (FASTLY)
1 2 18.196.130.47 16509 (AMAZON-02)
1 1 69.173.144.165 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
1 1 172.217.22.34 15169 (GOOGLE)
2 2 54.76.241.124 16509 (AMAZON-02)
1 1 52.34.54.104 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
3 3 52.29.122.216 16509 (AMAZON-02)
1 1 91.228.74.212 27281 (QUANTCAST)
1 54.243.114.159 14618 (AMAZON-AES)
1 54.243.119.74 14618 (AMAZON-AES)
2 6 52.31.106.135 16509 (AMAZON-02)
1 104.16.87.26 13335 (CLOUDFLAR...)
1 18.185.201.52 16509 (AMAZON-02)
2 4 54.93.117.16 16509 (AMAZON-02)
2 2 34.250.208.218 16509 (AMAZON-02)
1 2 143.204.214.70 16509 (AMAZON-02)
1 104.18.102.194 13335 (CLOUDFLAR...)
2 3 52.31.41.246 16509 (AMAZON-02)
1 1 35.190.16.14 15169 (GOOGLE)
4 144.76.115.247 24940 (HETZNER-AS)
7 208.100.17.185 32748 (STEADFAST)
11 2.18.232.7 16625 (AKAMAI-AS)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 208.100.17.187 32748 (STEADFAST)
1 3 89.163.159.108 24961 (MYLOC-AS)
1 194.213.222.29 5588 (GTSCE GTS...)
4 52.208.73.164 16509 (AMAZON-02)
1 52.28.206.36 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:20b... 16509 (AMAZON-02)
1 89.163.159.125 24961 (MYLOC-AS)
1 34.250.43.132 16509 (AMAZON-02)
1 34.248.95.73 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
1 2.18.232.130 16625 (AKAMAI-AS)
1 2.18.233.180 16625 (AKAMAI-AS)
1 104.111.230.142 16625 (AKAMAI-AS)
1 1 104.111.241.32 16625 (AKAMAI-AS)
1 2600:9000:20b... 16509 (AMAZON-02)
286 86
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
564 KB
27 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.1.damoh.giga.de
463 KB
19 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
208 KB
15 lijit.com
ap.lijit.com
gslbeacon.lijit.com
vap3ams1.lijit.com
ce.lijit.com
34 KB
14 google-analytics.com
www.google-analytics.com
44 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
188 KB
11 meetrics.net
lb24.s400.meetrics.net
3 KB
9 tynt.com
cdn.tynt.com
ic.tynt.com
de.tynt.com
5 KB
9 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
48 KB
8 googletagservices.com
www.googletagservices.com
192 KB
8 s-onetag.com
get.s-onetag.com
beacon.s-onetag.com
dfp-gateway.s-onetag.com
onetag-geo.s-onetag.com
26 KB
7 adscale.de
native.adscale.de
js.adscale.de
ih.adscale.de
13 KB
7 oadts.com
media.oadts.com
122 KB
7 scorecardresearch.com
sb.scorecardresearch.com
4 KB
7 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
4 KB
6 ml314.com
ml314.com
15 KB
6 adnxs.com
ib.adnxs.com
acdn.adnxs.com
6 KB
6 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
26 KB
6 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com Failed
135 KB
5 rubiconproject.com
fastlane.rubiconproject.com
pixel.rubiconproject.com
eus.rubiconproject.com
5 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 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
28 KB
4 eyeota.net
ps.eyeota.net
2 KB
4 cliipa.com
static.cliipa.com
bis.cliipa.com
server.cliipa.com
inventory.cliipa.com Failed
136 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 weborama.com
dx.bigsea.weborama.com
2 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
61 KB
3 adform.net
adx.adform.net
track.adform.net
2 KB
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
3 giga-abs.de
go.giga-abs.de
2 KB
3 gstatic.com
www.gstatic.com
csi.gstatic.com
264 B
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 consensu.org
cmp.teads.mgr.consensu.org
2 company-target.com
segments.company-target.com
1 KB
2 crwdcntrl.net
bcp.crwdcntrl.net
2 KB
2 adsrvr.org
match.adsrvr.org
893 B
2 mfadsrvr.com
rtb.mfadsrvr.com
927 B
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
113 B
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
116 KB
2 google.com
adservice.google.com
apis.google.com
18 KB
2 google.de
adservice.google.de
349 B
2 nuggad.net
si.nuggad.net
adscale.nuggad.net
2 KB
2 facebook.com
www.facebook.com
569 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 bluekai.com
tags.bluekai.com
856 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
673 B
1 weborama.fr
rd.frontend.weborama.fr
393 B
1 adsymptotic.com
p.adsymptotic.com
339 B
1 sharethis.com
pd.sharethis.com
170 B
1 quantserve.com
pixel.quantserve.com
698 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
450 B
1 powerlinks.com
px.powerlinks.com
402 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 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
449 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
84 KB
1 speedcurve.com
cdn.speedcurve.com
7 KB
286 67
Domain Requested by
15 securepubads.g.doubleclick.net 1 redirects www.googletagservices.com
securepubads.g.doubleclick.net
www.giga.de
14 www.google-analytics.com www.giga.de
www.google-analytics.com
14 www.giga.de www.giga.de
13 trc.taboola.com 5 redirects cdn.taboola.com
www.giga.de
11 lb24.s400.meetrics.net www.giga.de
8 vidstat.taboola.com confiant-integrations.global.ssl.fastly.net
vidstat.taboola.com
8 ap.lijit.com get.s-onetag.com
ap.lijit.com
www.giga.de
8 www.googletagservices.com js.stroeermediabrands.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
static.cliipa.com
7 ic.tynt.com www.giga.de
7 media.oadts.com www.giga.de
media.oadts.com
7 sb.scorecardresearch.com 3 redirects cdn.taboola.com
www.giga.de
6 t.teads.tv www.giga.de
6 ml314.com 2 redirects www.giga.de
ml314.com
6 cdn.taboola.com www.giga.de
cdn.taboola.com
www.googletagservices.com
6 tracking.m6r.eu 2 redirects www.giga.de
cdn.m6r.eu
media.oadts.com
6 videos.giga.de www.giga.de
videos.giga.de
text
5 match.taboola.com www.giga.de
5 dfp-gateway.s-onetag.com get.s-onetag.com
5 ib.adnxs.com 4 redirects cdn-a.yieldlove.com
5 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
4 a.teads.tv www.giga.de
confiant-integrations.global.ssl.fastly.net
a.teads.tv
4 ssl.1.damoh.giga.de text
4 ce.lijit.com 1 redirects www.giga.de
4 ps.eyeota.net 2 redirects www.giga.de
4 ih.adscale.de 1 redirects js.adscale.de
www.giga.de
4 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 convammp.taboola.com
3 dx.bigsea.weborama.com 2 redirects www.giga.de
3 x.bidswitch.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 fastlane.rubiconproject.com cdn-a.yieldlove.com
3 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 go.giga-abs.de www.giga.de
3 de.ioam.de 2 redirects www.giga.de
3 d.nativendo.de www.giga.de
c.nativendo.de
confiant-integrations.global.ssl.fastly.net
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
3 static.giga.de www.giga.de
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 csi.gstatic.com pagead2.googlesyndication.com
2 uss.xplosion.de www.giga.de
2 ups.xplosion.de confiant-integrations.global.ssl.fastly.net
cdn.emetriq.de
2 dmp.theadex.com confiant-integrations.global.ssl.fastly.net
2 cmp.teads.mgr.consensu.org confiant-integrations.global.ssl.fastly.net
2 segments.company-target.com 1 redirects www.giga.de
2 bcp.crwdcntrl.net 2 redirects
2 match.adsrvr.org 2 redirects
2 rtb.mfadsrvr.com 1 redirects www.giga.de
2 vap3ams1.lijit.com www.giga.de
2 static.cliipa.com securepubads.g.doubleclick.net
static.cliipa.com
2 js.adscale.de confiant-integrations.global.ssl.fastly.net
2 video-adserver.ibillboard.com media.oadts.com
2 track.adform.net 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 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 adservice.google.de pagead2.googlesyndication.com
www.googletagservices.com
2 www.facebook.com www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 onetag-geo.s-onetag.com beacon.s-onetag.com
1 tags.bluekai.com 1 redirects
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 acdn.adnxs.com cdn-a.yieldlove.com
1 adstax-match.adrtx.net confiant-integrations.global.ssl.fastly.net
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 sync.teads.tv confiant-integrations.global.ssl.fastly.net
1 de.tynt.com cdn.tynt.com
1 tracker-adserver.ibillboard.com www.giga.de
1 imprammp.taboola.com confiant-integrations.global.ssl.fastly.net
1 adscale.nuggad.net 1 redirects
1 rd.frontend.weborama.fr 1 redirects
1 p.adsymptotic.com www.giga.de
1 pd.sharethis.com www.giga.de
1 cdn.tynt.com confiant-integrations.global.ssl.fastly.net
1 server.cliipa.com static.cliipa.com
1 bis.cliipa.com static.cliipa.com
1 pixel.quantserve.com 1 redirects
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com 1 redirects
1 15.taboola.com confiant-integrations.global.ssl.fastly.net
1 gslbeacon.lijit.com ap.lijit.com
1 native.adscale.de c.nativendo.de
1 cdn.stroeerdigitalmedia.de www.giga.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 files.giga-video.de www.giga.de
1 tpc.googlesyndication.com securepubads.g.doubleclick.net
1 adx.adform.net cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 cdn.m6r.eu js.stroeermediabrands.de
1 ajax.googleapis.com www.giga.de
1 apis.google.com www.giga.de
1 dkuim.de www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 beacon.s-onetag.com get.s-onetag.com
1 adservice.google.com pagead2.googlesyndication.com
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 irqs.ioam.de script.ioam.de
1 get.s-onetag.com www.giga.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
286 118
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-11 -
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-08-23 -
2019-11-21
3 months crt.sh
*.google.com
GTS CA 1O1
2019-08-23 -
2019-11-21
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
*.s-onetag.com
Amazon
2019-06-25 -
2020-07-25
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2019-08-23 -
2019-11-21
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
*.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
*.lijit.com
Go Daddy Secure Certificate Authority - G2
2019-03-11 -
2020-05-10
a year crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-05-06 -
2019-11-12
6 months crt.sh
*.googleapis.com
GTS CA 1O1
2019-08-23 -
2019-11-21
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
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.apis.google.com
GTS CA 1O1
2019-08-23 -
2019-11-21
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-12-12 -
2019-12-10
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2018-02-02 -
2019-10-02
2 years crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
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
*.bootstrapcdn.com
COMODO RSA Domain Validation Secure Server CA
2018-10-03 -
2019-10-12
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
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
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.cliipa.com
COMODO RSA Domain Validation Secure Server CA
2018-11-19 -
2019-11-19
a year crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-03 -
2019-11-19
7 months crt.sh
rtb.mfadsrvr.com
Sectigo RSA Domain Validation Secure Server CA
2019-02-28 -
2021-02-27
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
*.ml314.com
Amazon
2019-03-16 -
2020-04-16
a year crt.sh
*.tynt.com
COMODO RSA Domain Validation Secure Server CA
2014-10-14 -
2019-10-13
5 years crt.sh
*.sharethis.com
Go Daddy Secure Certificate Authority - G2
2017-09-26 -
2020-09-29
3 years crt.sh
*.eyeota.net
Let's Encrypt Authority X3
2019-07-11 -
2019-10-09
3 months crt.sh
*.company-target.com
Go Daddy Secure Certificate Authority - G2
2019-06-19 -
2021-08-18
2 years crt.sh
ssl919748.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-06-17 -
2019-12-24
6 months crt.sh
*.bigsea.weborama.com
Go Daddy Secure Certificate Authority - G2
2018-10-24 -
2019-11-16
a year crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
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-07-15 -
2019-10-13
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
tpc.googlesyndication.com
GTS CA 1O1
2019-08-23 -
2019-11-21
3 months 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
GeoTrust RSA CA 2018
2019-04-23 -
2020-02-19
10 months crt.sh

This page contains 33 frames:

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

Frame: https://videos.giga.de/embed/176875?autoplay=0
Frame ID: 83D0565776F6AD8D018E2EB09B947E31
Requests: 19 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: 282FB13138E52BA40B385854CB9C0AED
Requests: 1 HTTP requests in this frame

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

Frame: https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
Frame ID: E041A657A626337723A16A2926ADC21E
Requests: 22 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=1568187288&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&dt=1568187288003&bpp=9&bdt=170&fdt=208&idt=208&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&correlator=8223080048408&frm=20&pv=2&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=2251851893044128&dssz=62&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=20199335%2C21060078&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&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0yT4laeFmO&p=https%3A//www.giga.de&dtd=226
Frame ID: 11734E2531B26F277749EEF4DA1A8CE6
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=1568187288&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=1568187288012&bpp=5&bdt=180&fdt=266&idt=266&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=8223080048408&frm=20&pv=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=3333078966304&dssz=68&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=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060078&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&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=271
Frame ID: 3AEAEDAD6373029BF2F08DE0EF9D309A
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: 043C31E4E3D7BB81094A32F313CE21EF
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvJZVnYKtZj0Pfj0E6LXkl2WrnpwopoKHnKElcZ_Dhr92Yug3lFdgTdQ4Cw6ksXlo1LjOEjoQCdcKwItZcvzF-1qHS_QuOTfKjKgYvNQthn9SUbC0XsJT5Zax0Mn5rN4hAkMj6WETvDBnLvEoP42CPykYJpkzNXjRenC5WmrX2SsGUUnR7BWMAssZK4lmbCTI0U7JXQua-pvQPuPdx_pyki7Hu5Il7uexV5RDK_aHamwxGtH8pDFQH7WsxKKLOmmp6hUTnFY080tUVJOGuSbMnZlw&sig=Cg0ArKJSzITv7D8St8ZlEAE&urlfix=1&adurl=
Frame ID: 53DA45E91E3474AC2205B76CE266540C
Requests: 14 HTTP requests in this frame

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv-D496jGRwqnK0dOOf4InVGHaWpr3kG2qm-MXrZKybHe0qdBmLK-3beR1gkK0bh-y56F8ghzwnMYZLbMP7gKMfl4L6beIwv3wkfwzMcaVJDM-EsMtlyoLYDq21C1LlBdTU4OPnyYVCufM9mEwXQay36Wjko8PcTq07lx-B8pwJKQgYf_2KZGehXHFcTQ5URJWT7U2IPqrNxHv6mf-K8uZdgQzzZV-Vhb9GbeY_JN6z80DNKlvhtQL4LObztyM4WAf2UnPM3A_CSAOLBOjmB_q-tUeLgtJ1_nXRWoqjut1t&sig=Cg0ArKJSzH2bAXM2__gDEAE&urlfix=1&adurl=
Frame ID: F2DF4282F25394308FDC6EC240B4242D
Requests: 2 HTTP requests in this frame

Frame: https://track.adform.net/adfscript/?bn=31959167;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
Frame ID: 111ED139DEA2C9ED889D21ADB2CA1230
Requests: 1 HTTP requests in this frame

Frame: https://track.adform.net/adfscript/?bn=31959168;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
Frame ID: CD116392F369631FEA1C05CB05C3DA25
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss8cohc6935sGBJBdG_OEqJasPIhxzXCzmELP8y0ho-N5_hcnnm_6Ah_luQvi_BwWGhRHn5uZnneB_o5Q92E0eF_nvjkjqHHravm_pq3QaKIfmgrqzA5i-MyPhEbxuASwfGlnvqjdPc5VvAjbCeEbAjdAg9Kbh5lOty9lExSq1Q431jgcPRift7c56OVlSDqeGKUbD00aZEoXOeS3AiaiWVqiHgyW5rLdd1l4k9LuVhQ9FX-AaDQkpc3lhRAlwDEcatj3vzhp4v3IH9WRG_quuWxSnPpaOTkvpnTAh5gJfU&sig=Cg0ArKJSzLXRF2YWfomLEAE&urlfix=1&adurl=
Frame ID: E788D5318DB7A129C5A7BC1860EAA5AE
Requests: 2 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssoaSDU-E6LW84h8FSEsKQWoT08GXOCpjOWQ-TV5R_ioVoRcp9b3_MK-_Fmdk6iYbTdZnrOE1N0ixyzQwLJzSIGDetYQQa6vivAYa6y897amEmYBcLSb8x3YFWR2YX8a_o-NCRUmMiMrPB0vUnVg9dOwEE0unlZus7e9Be2vGYwtINE_XsZwBl9vd27JCqPTqcFRm3BOlht0Gft8awfRGkh0KJA98znmDrZ1rTPAPlfC97VjKvMcNB_WqZNU4ZXek5tF_w1wQmqc1O2KWcVmpFcOZPc6XgAH3Ec1OJM&sig=Cg0ArKJSzEr8StyIKcGAEAE&urlfix=1&adurl=
Frame ID: 03CBCECFA76BBB4A1963370E4762C5CC
Requests: 13 HTTP requests in this frame

Frame: https://gslbeacon.lijit.com/beacon?viewId=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&rand=5462&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&v=1.2
Frame ID: D812D3CBFABFABE2E729F7CCAE6D25A2
Requests: 1 HTTP requests in this frame

Frame: https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
Frame ID: 0EBC1CE2B61E30ADB9D4307D576054C1
Requests: 11 HTTP requests in this frame

Frame: https://ih.adscale.de/map?format=display&ssl=1&nut&uu=2f68e771da764dbaa5621824bc8c2f32
Frame ID: C77A229F3337F59674DED9ECACFFCC93
Requests: 1 HTTP requests in this frame

Frame: https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/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: A62C790427137EA551A93533D8764D7C
Requests: 1 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=888CF1732517504431055646127&cicmp=1657475&cijs=1&dast=V7fIQCFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosthsdpPhYjVaTSHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDAIqD4Vx368tudLg-L7s_AAAeAkAAAAYUSAAGcJpKACpyDk4AAAAAAAAAAFj-____YwD0iM9kADKUBm8MegAefAAehAAAALKGaJGuMQevfh6ICg6LGAEAAABAMrV5HE3qhMqiCgCAIN0K4AoAIKDt48dhOEt3UOItDAAAgGBsgR4Wv9_ssGv8bpcBAAAAAAAAAJj9n_2jCRGNuaUFsRTwqv0CAgCs_QICALCpGwDAWwBc0AXA6gxishntJrMDAAAAuPv____XA4nFzLjybSwe02Bh2UwcnpXJZdlMVrPJYrCZLUbbGyofot7cNYLpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhBHbZuIxLnxryWphcouWG99aONrM1jKLbWUczVaDwcS5Fr0-ptNuMlkuhlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8ZiZlz5NhaPabCwbCYOz8rksmwmq9lkMdjMFqN9xbaZeIwL31qyWpjcouXGtxaONrO1zGJbGUez1WAwca5Fr4_ptJtMlovhvrGaDRfD3WQ43DdWs-FiuJsMh_sOneG7-pyNyptW4dEp036hbilzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTpReVYji28xWC5nK4fJZZpMZqbNbLRZWXYTi2s3s4glStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HAY!&excid=22&tst=1&docw=0
Frame ID: A109D0E9049D77B815D42E1E0C0A3FD4
Requests: 1 HTTP requests in this frame

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

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

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

Frame: https://sync.teads.tv/iframe?pid=73584&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&gdprIab={%22status%22:21,%22consent%22:%22%22,%22reason%22:210}&env=js-web&1568187290259
Frame ID: 3EE4D05DF0DCA63EF79CB0867930BF8F
Requests: 1 HTTP requests in this frame

Frame: https://ap.lijit.com/beacon?informer=13413818&gdpr_consent=
Frame ID: 26737B32989D505D16E2815E2DD3A726
Requests: 1 HTTP requests in this frame

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

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

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

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: 9BCF23A17A914A97B192DCBBE5D17F79
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: 5D9407DD2562269BF7EC0A5A534CB61E
Requests: 1 HTTP requests in this frame

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

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

Frame: https://eus.rubiconproject.com/usync.html
Frame ID: 0C807340DB2656BED7DDCD05F18D0B83
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 /googlesyndication\.com\//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

286
Requests

97 %
HTTPS

20 %
IPv6

67
Domains

118
Subdomains

86
IPs

8
Countries

2928 kB
Transfer

9200 kB
Size

0
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 20
  • 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=0011&i2=00114dbba15f4b9b55d78a397&ep=1592056718&vr=415&id=sxnjyl&i3=00114dbba15f4b9b55d78a397%3A1596526487876%3A1568187287876%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1568187287876&n1=2&dntt=0&lt=1568187287878&ev=&cs=b8n7q1&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=0011&i2=00114dbba15f4b9b55d78a397&ep=1592056718&vr=415&id=sxnjyl&i3=00114dbba15f4b9b55d78a397%3A1596526487876%3A1568187287876%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1568187287876&n1=2&dntt=0&lt=1568187287878&ev=&cs=b8n7q1&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 26
  • 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 30
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 73
  • 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 110
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvY9ZFUxVLpuDhS-SCvHcaweRY3udbl4lKF8rRVvCXLhnKqM7RIHC03wf8-xtlX4SHXI84XwFUx2VYznKIHrr2hYwGTIFeXonbIkoCOAxySc_V4hoOhpOajTmKUzB8UtuJX0LnqYqOiTFUvx6FYftYxWqqTrLvNeXEv2PEb2wpZFH1LFCuxNNYf5Ddz_YlEVRTa-RMJ9awlSlvwiRy1SgUMEl6Pb2ogVdMosJXUz1lvEUwS0s-hbLJ3EM4h4CiosPNAnti2FkM-4GyB0UUaBg&sig=Cg0ArKJSzBfpkc6oiLo9EAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 113
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1568187288852&ns_c=UTF-8&cv=3.1&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=1568187288852&ns_c=UTF-8&cv=3.1&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 156
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
Request Chain 157
  • https://pixel.rubiconproject.com/exchange/sync.php?p=16698 HTTP 302
  • https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Request Chain 158
  • 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=dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY%3D
Request Chain 159
  • 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=4604369351475478241 HTTP 302
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=4604369351475478241&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D4604369351475478241
Request Chain 160
  • 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=CAESEDoQGUUwCwiguQMJDWkxN28&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3DCAESEDoQGUUwCwiguQMJDWkxN28%26google_cver%3D1
Request Chain 161
  • 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=4604369351475478241
Request Chain 162
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3Dfd305b20-5c46-47da-a4e2-e4ecbab05e91
Request Chain 163
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D0046f824-1366-4ec1-9220-16d00120d950
Request Chain 166
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://pixel.quantserve.com/pixel/p-zLwwakwy-hZw3.gif?idmatch=0&ssp=taboola HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=76&user_group=2&ssp=taboola&gdpr=1&gdpr_consent=&user_id=gS01idV6O4iZcWGE13wvgIFwMYCZLWOJhy93Fw97 HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?dsp_id=76&user_group=2&ssp=taboola&gdpr=1&gdpr_consent=&user_id=gS01idV6O4iZcWGE13wvgIFwMYCZLWOJhy93Fw97 HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302 HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3De3dbde91-3417-4114-be09-7ec805382302
Request Chain 183
  • https://ce.lijit.com/merge?pid=5176&3pid=1 HTTP 302
  • https://ce.lijit.com/merge?pid=5176&3pid=1&dnr=1
Request Chain 184
  • https://bcp.crwdcntrl.net/5/c=5436/tp=SVRN/tpid=de2e0b8c7ff08336dcad6b3e/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id} HTTP 302
  • https://bcp.crwdcntrl.net/5/ct=y/c=5436/tp=SVRN/tpid=de2e0b8c7ff08336dcad6b3e/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id} HTTP 302
  • https://ce.lijit.com/merge?pid=5001&3pid=e20efdfb5b09d6b8ade69bf5622a7d51
Request Chain 185
  • https://segments.company-target.com/log?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e HTTP 303
  • https://segments.company-target.com/validateCookie?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e&verifyHash=46ab6971e7da86cac29495c37bc34111e18876b2
Request Chain 187
  • https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=de2e0b8c7ff08336dcad6b3e HTTP 302
  • https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=de2e0b8c7ff08336dcad6b3e&bounced=1&rn=333754 HTTP 302
  • https://rd.frontend.weborama.fr/rd?url=https%3A%2F%2Fdx.bigsea.weborama.com%2Fcollect%3Fdsp_id%3D0%26eid%3D%7BWEBO_ID%7D HTTP 302
  • https://dx.bigsea.weborama.com/collect?dsp_id=0&eid=ABt2rDP@fJAA
Request Chain 199
  • https://ih.adscale.de/map?format=display&ssl=1 HTTP 302
  • https://ih.adscale.de/map?format=display&ssl=1&nut&uu=2f68e771da764dbaa5621824bc8c2f32
Request Chain 200
  • 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%2F362bbab8f6944c9894a0c3daf66ec9c1%2Fts%2F1568187289374%2Fv%2F2%2Fhid%2F406%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/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/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 215
  • 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=1568187290118&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=72567591&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?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=1568187290118&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=72567591&cs_ucfr=1
Request Chain 218
  • 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=1568187290162&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=46295054&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?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=1568187290162&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=46295054&cs_ucfr=1
Request Chain 273
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCEiU3Ws7ZBSaCWDUkWsfABifABSfABSfABi7ABifABfrr&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=4203577252589578194
Request Chain 278
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Request Chain 283
  • https://ib.adnxs.com/getuid?https://ml314.com/csync.ashx%3Ffp=$UID%26person_id=5978151496344721696%26eid=2 HTTP 302
  • https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%3A%2F%2Fml314.com%2Fcsync.ashx%253Ffp%3D%24UID%2526person_id%3D5978151496344721696%2526eid%3D2 HTTP 302
  • https://ml314.com/csync.ashx?fp=3739492794812319017&person_id=5978151496344721696&eid=2
Request Chain 284
  • https://tags.bluekai.com/site/20486?limit=0&id=5978151496344721696&redir=https://ml314.com/csync.ashx%3Ffp=$_BK_UUID%26person_id=5978151496344721696%26eid=50056 HTTP 302
  • https://ml314.com/csync.ashx?fp=37f1mx9999YqXlC5&person_id=5978151496344721696&eid=50056
Request Chain 285
  • https://ps.eyeota.net/pixel?pid=r8hrb20&t=gif HTTP 302
  • https://ps.eyeota.net/pixel/bounce/?pid=r8hrb20&t=gif HTTP 302
  • https://ml314.com/utsync.ashx?eid=50052&et=0&fp=2ynK7ETltZJB4QC_I2DLaJC8nyPgtbh04k_FWhG64Bf4&gdpr=1&gdpr_consent=&return=https%3A%2F%2Fps.eyeota.net%2Fmatch%3Fbid%3Dr8hrb20%26uid%3Dnil HTTP 302
  • https://ml314.com/csync.ashx?fp=2ynK7ETltZJB4QC_I2DLaJC8nyPgtbh04k_FWhG64Bf4&person_id=5978151496344721696&eid=50052&return=https%3a%2f%2fps.eyeota.net%2fmatch%3fbid%3dr8hrb20%26uid%3dnil HTTP 302
  • https://ps.eyeota.net/match?bid=r8hrb20&uid=nil

286 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
e88360f9b89be1fc9cc456883799afb4dbbf3c0029d6fc225053f7e7da298620

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
Wed, 11 Sep 2019 07:34:47 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
Wed, 11 Sep 2019 07:34:47 GMT
last-modified
Tue, 10 Sep 2019 12:27:11 GMT
server
nginx
accept-language
bytes
etag
"5d77969f-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
Thu, 10 Sep 2020 07:34:47 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
Wed, 11 Sep 2019 07:34:47 GMT
last-modified
Tue, 10 Sep 2019 12:27:11 GMT
server
nginx
accept-language
bytes
etag
"5d77969f-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
Thu, 10 Sep 2020 07:34:47 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
Wed, 11 Sep 2019 07:34:47 GMT
last-modified
Tue, 10 Sep 2019 12:27:11 GMT
server
nginx
accept-language
bytes
etag
"5d77969f-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
Thu, 10 Sep 2020 07:34:47 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
41355
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19160-FRA
access-control-allow-origin
*
last-modified
Tue, 10 Sep 2019 20:05:32 GMT
server
Apache
x-timer
S1568187288.866068,VS0,VE0
date
Wed, 11 Sep 2019 07:34:47 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Wed, 11 Sep 2019 20:05:32 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
2769
pre-cf939aa283.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-cf939aa283.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
d6af9eda08729e007970d2ecd0a08c6282e37c2e58b16ce0c10737d95b23b5ba

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, 10 Sep 2019 11:09:51 GMT
content-encoding
gzip
x-original-content-length
60608
server
nginx
status
200
etag
W/"5d778427-ecc0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19339
expires
Wed, 09 Sep 2020 11:09:51 GMT
main-desktop-5871470d6d.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-5871470d6d.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
18fb2b55cf8f17a3ecffab0fe2223921a6ccba4bffd6ed33a03ef3bf619a9148

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, 10 Sep 2019 11:09:51 GMT
content-encoding
gzip
x-original-content-length
364814
server
nginx
status
200
etag
W/"5d778426-5910e"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
50114
expires
Wed, 09 Sep 2020 11:09:51 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.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0011
Resource Hash
bcd1aed80d001c6e2dd7d6cdb8afc479d590f0626275ead449144986cd2fc0ab

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 07:34:47 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Sep 2019 07:34:47 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0011
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
Wed, 11 Sep 2019 09:34:47 GMT
metaTag.min.289a9882b578f36829997a593f422307.js
js.stroeermediabrands.de/
257 KB
62 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.289a9882b578f36829997a593f422307.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
599702a6babb221269ef1ad7b9faffc61139cfc32b10038b2bafb61615e7d5c9

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 07:34:47 GMT
content-encoding
gzip
last-modified
Tue, 10 Sep 2019 13:09: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
Thu, 10 Sep 2020 07:34:47 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
Tue, 20 Aug 2019 14:38:47 GMT
x-content-type-options
nosniff
age
1875360
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Tue, 20 Aug 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
Thu, 19 Sep 2019 14:38:47 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
95 KB
34 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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e02d515703c7645b1724e0f74e0feffcc591b2988b662de83b2cc6c7bb0375a4
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, 11 Sep 2019 07:34:47 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
35041
x-xss-protection
0
server
cafe
etag
12674843848685416215
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Wed, 11 Sep 2019 07:34:47 GMT
1.gif
www.gstatic.com/psa/static/
53 B
152 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:824::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
Thu, 22 Aug 2019 16:03:09 GMT
x-content-type-options
nosniff
last-modified
Thu, 21 Apr 2016 03:17:22 GMT
server
sffe
age
1697498
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
Fri, 21 Aug 2020 16:03: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
185352
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
ed12abebf74d61e8a6846dd87861bbe0c58355d207ef453eabd28a82e0519496

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 07:34:47 GMT
Content-Encoding
gzip
Last-Modified
Mon, 26 Aug 2019 12:30:08 GMT
ETag
"5d63d0d0-6cb8"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Expires
Thu, 12 Sep 2019 07:34:47 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
Wed, 11 Sep 2019 07:34:47 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
Wed, 11 Sep 2019 07:34:47 GMT
Last-Modified
Wed, 11 Sep 2019 07:34:47 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
323 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:f11c:8083:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

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 07:34:47 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Wed, 11 Sep 2019 07:34:47 GMT
tag.min.js
get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/
70 KB
16 KB
Script
General
Full URL
https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.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
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:a400:1f:287:d20a:ce1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
02a7b0524c2c00da3b4d41595a90ff9ebdd1662955c3919e412ca07ce79f118e

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
hOsyJE0qOnWEl7X3M.i76385dbqabo0x
content-encoding
gzip
last-modified
Tue, 03 Sep 2019 17:36:55 GMT
server
AmazonS3
age
3082
date
Wed, 11 Sep 2019 06:43:26 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/javascript
status
200
cache-control
max-age=3600
x-amz-cf-pop
FRA56
x-amz-cf-id
bUdKgPMmAG3-L6U8UfDgRCO48vlKwIigA0wVUql0_a_3fes1SNaIqg==
via
1.1 d942ee6a387b745954972448a42def1c.cloudfront.net (CloudFront)
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-cf939aa283.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::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
3074
date
Wed, 11 Sep 2019 06: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
Wed, 11 Sep 2019 08: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-cf939aa283.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.211.231 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-211-231.fra53.r.cloudfront.net
Software
Server /
Resource Hash
429e8f62ea6700f952db60ed9f95d5c6b4791a4d8cd2877424c8f17a1793a184

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, 10 Sep 2019 20:14:12 GMT
content-encoding
gzip
server
Server
age
40834
etag
ddd9d5f81cde70f506947a629eb2805e
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
timing-allow-origin
*
x-amz-cf-id
1pGygi7WTHqvgeh6Dl3-UaWeexi9bLIcfk2HuSD-ocsSiMMbJUkxQw==
via
1.1 16dc09493f48bbc1fd2cdd6e175a94f7.cloudfront.net (CloudFront)
init
d.nativendo.de/cds/delivery/
991 B
918 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
ba78228683af43e25c31f85ad078af375af1cab55f5b897af66556565e9b178c

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
Wed, 11 Sep 2019 07:34:47 GMT
content-encoding
gzip
last-modified
Wed, 11 Sep 2019 07:34:47 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.7250722749098386
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
Wed, 11 Sep 2019 07:34:47 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=0011&i2=00114dbba15f4b9b55d78a397&ep=1592056718&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=0011&i2=00114dbba15f4b9b55d78a397&ep=1592056718&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
Wed, 11 Sep 2019 07:34:48 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
Thu, 12 Sep 2019 07:34:48 GMT

Redirect headers

Date
Wed, 11 Sep 2019 07:34:47 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
Wed, 11 Sep 2019 07:34:47 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
Tue, 11 Sep 2018 07:34:47 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-5871470d6d.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
Wed, 11 Sep 2019 07:34:47 GMT
last-modified
Tue, 10 Sep 2019 12:27:11 GMT
server
nginx
accept-language
bytes
etag
"5d77969f-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
Thu, 10 Sep 2020 07:34:47 GMT
176875
videos.giga.de/embed/ Frame 83D0
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
521a5ee50dd61f7f1c507642547234f718f563550d908fa000000f7c84a8d573

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=00114dbba15f4b9b55d78a397:1596526487876:1568187287876:.giga.de:2:giga:software_content:noevent:1568187287876:xoogs6
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
Wed, 11 Sep 2019 07:34:47 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-5871470d6d.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
Thu, 28 Mar 2019 00:02:44 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
Fri, 27 Mar 2020 00:02:44 GMT
js
www.google-analytics.com/gtm/
75 KB
25 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=2009388133.1568187288&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:825::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
e7d3b55b502a3544dac407c356d2805d4f6c9bca4d7ad1c0f3fd5e5e62fcdc5e
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
Wed, 11 Sep 2019 07:34:47 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
25850
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:47 GMT
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.8612135521330118
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
Wed, 11 Sep 2019 07:34:47 GMT
X-Content-Type-Options
nosniff
Last-Modified
Wed, 11 Sep 2019 07:34:47 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Thu, 12 Sep 2019 07:34:40 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame 282F
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
Wed, 11 Sep 2019 07:34:48 GMT
Content-Length
1578
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=e31d4beb14948a7bc188c1d3a9a51832; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Tue, 10 Dec 2019 07:34:47 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
Wed, 11 Sep 2019 07:34:47 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Wed, 11 Sep 2019 08:34:47 GMT
gpt.js
www.googletagservices.com/tag/js/
40 KB
12 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.289a9882b578f36829997a593f422307.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
19eecf8f26e673b201eb4708482fd5a672a15c66a8c0492f62ebb3d3f5b70cd0
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, 11 Sep 2019 07:34:47 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"275 / 940 of 1000 / last-modified: 1568045091"
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
12614
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:47 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
269 KB
84 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.289a9882b578f36829997a593f422307.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.67 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-67.fra53.r.cloudfront.net
Software
/ Express
Resource Hash
03b48f18b2d6d1c1f4f392881dc2c4e9801f275d17a9f0f30ebddb3341844e77

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 07:08:01 GMT
content-encoding
gzip
age
1607
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
FRA53-C1
x-amz-cf-id
zf8YQeLNxnqrBGXzmZ8GLpZIlM6PhIl9Lq1-SqHeX7Zib3JOmcO1Kg==
via
1.1 269bfdd288bfea5423a4e9e701777da6.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.289a9882b578f36829997a593f422307.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
Wed, 11 Sep 2019 07:34:48 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
Wed, 11 Sep 2019 09:34:48 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
9b9f3d905ebf4de7d11a53380168ce066850f5f415aab71e8acee8e0b46618e3

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
Wed, 11 Sep 2019 07:34:48 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
Wed, 11 Sep 2019 07:34:48 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/
867 B
990 B
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.289a9882b578f36829997a593f422307.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
f21a7216b774be0fdbe4267a5630aa74311f31d3be4c0950f9a1192db4f566f3

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 07:34:48 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
Transfer-Encoding
chunked
Connection
close
Content-Type
text/javascript
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 GMT
ad-loading.gif
www.dunkirkinception.com/detect/
138 B
449 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
3fafca44c304f7b6eab7180819c3732b59e55eac85e21e595cb75869498952e0

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
Wed, 11 Sep 2019 07:34:48 GMT
X-Powered-By
TSAdServer
ETag
W/"8a-xCUrsesxo1R78C+3IVSYWrZ8l2A"
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
138
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:80b::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
Wed, 11 Sep 2019 07:34:48 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
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:80b::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
Wed, 11 Sep 2019 07:34:48 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/r20190905/r20190131/
222 KB
82 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190905/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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
b2cd7de9873f721decdc67b217b48247a2f03deb326a4e8d34bc521cabff5741
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, 11 Sep 2019 07:34:48 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
83960
x-xss-protection
0
server
cafe
etag
18153305224246098284
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 11 Sep 2019 07:34:48 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190905/r20190131/ Frame DE0E
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190905/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:80b::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/r20190905/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
Thu, 05 Sep 2019 18:02:41 GMT
expires
Thu, 19 Sep 2019 18:02:41 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
480727
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
post-4c71d5d921.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-4c71d5d921.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-cf939aa283.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
0baa1b7da945fc3334d5683c8502c3da91529a8a35afaf0e591be34633adf609

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, 20 Aug 2019 13:13:56 GMT
content-encoding
gzip
x-original-content-length
7084
server
nginx
status
200
etag
W/"5d5bf1bf-1bac"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2684
expires
Wed, 19 Aug 2020 13:13:56 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-cf939aa283.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:23:25 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:23:25 GMT
smb-phone-plan-8069c0d527.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
16 KB
5 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-8069c0d527.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-cf939aa283.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
0f51b6594e913d4184adf3ca9ec8654a67110ae742e1c61472dacd56e14a6fa6

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, 10 Sep 2019 09:25:54 GMT
content-encoding
gzip
x-original-content-length
16578
server
nginx
status
200
etag
W/"5d776bce-40c2"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
5040
expires
Wed, 09 Sep 2020 09:25:54 GMT
beacon.min.js
beacon.s-onetag.com/
18 KB
6 KB
Script
General
Full URL
https://beacon.s-onetag.com/beacon.min.js
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:9600:5:9a4c:9b00:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
662fa6bcdf71d8f92e29010d3e2e270e0071e5d19b1d14ce205654a78aa0a7a9

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
dQ2IPgbwW_sArXQW0CBb3eN5W57SqoQ0
content-encoding
gzip
last-modified
Thu, 04 Apr 2019 09:35:05 GMT
server
AmazonS3
age
2029
date
Wed, 11 Sep 2019 07:01:00 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=3600
x-amz-cf-pop
FRA56
x-amz-cf-id
AZju3J8CB7wBGh6MoJxW4Agdq14ju069OsXN7zVHxfHWm6hJs6Ij7w==
via
1.1 a853d87afe2972a208a9cd92a357386b.cloudfront.net (CloudFront)
fpi.js
ap.lijit.com/www/delivery/ Frame E041
5 KB
3 KB
Script
General
Full URL
https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
1d620a0f7dc002fca2d94bf2da586b9198b9fa94a3b53e9eeb069833081f119d

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
Wed, 11 Sep 2019 07:34:48 GMT
Content-Encoding
gzip
Server
nginx
ETag
W/"5d018e10-1534"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0
Transfer-Encoding
chunked
X-Sovrn-Pod
ap3ams1
Expires
Thu, 01 Jan 1970 00:00:01 GMT
bid
c.amazon-adsystem.com/e/dtb/
122 B
503 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=7286246159041568187288062&cb=2173656070001568187288064&ws=1600x1200&v=7.36.00&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
143.204.211.231 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-211-231.fra53.r.cloudfront.net
Software
Server /
Resource Hash
a88f634d6fbb391a3ce5cbcb74dfe045a0f6eb7ec91990818a511ed391d80983

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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA53-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 16dc09493f48bbc1fd2cdd6e175a94f7.cloudfront.net (CloudFront)
x-amz-cf-id
d1VpnDszbls9C07denhcsAh-u6-eqXFZgHV1MQw_gpluc12F3LYYgA==
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
143.204.211.231 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-211-231.fra53.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
Mon, 09 Sep 2019 20:14:14 GMT
content-encoding
gzip
vary
Accept-Encoding,Origin
age
40824
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 0cbb1ca51bf146be48b40804581e4466.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
er7enDUOSwBIyWx9NtqecZGwrr59e1Ht55hPkzQP_Hek-KnUouxdiQ==
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-cf939aa283.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
Thu, 28 Mar 2019 00:02:44 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
Fri, 27 Mar 2020 00:02:44 GMT
loader.js
c.nativendo.de/cdn/asset/js/
52 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1159
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
20d9df1102585ece75fec7d91e5e34837cbe41fa16e0d7f29eab5142affd592f

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 07:34:48 GMT
via
1.1 google
cf-cache-status
HIT
age
59683
cf-polished
origSize=53181
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
5147f616be73cbcc-VIE
expires
Thu, 10 Sep 2020 07:34:48 GMT
videojs-02e1d46d.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 83D0
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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
last-modified
Tue, 27 Aug 2019 09:58:54 GMT
server
nginx/1.14.1
etag
W/"5d64fede-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 83D0
255 KB
86 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:809::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
6a157c77153a760d884ee2996cce42e36fd78ee59803c7d6744fde39293b5666
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
Wed, 11 Sep 2019 07:34:48 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
88159
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:48 GMT
lOyU-OCKINPe2.gif
www.giga.de/imagez/adbanner2/
71 B
474 B
Image
General
Full URL
https://www.giga.de/imagez/adbanner2/lOyU-OCKINPe2.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
Wed, 11 Sep 2019 07:34:48 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
submit
lb24.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb24.s400.meetrics.net/bb-mx/submit?/WWT8BJAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSsIBPAAAAAAAAAOAAAAGBAAAAAAZwSsIBBRksFAQtjFZui9SA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:48 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Wed, 11 Sep 2019 07:34:47 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8CJAAATkzFARksFAQtjFBpJNSA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:48 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:47 GMT
pubads_impl_2019082901.js
securepubads.g.doubleclick.net/gpt/
158 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
ec6c461b6a7da1d28c5bb10b93c755c080ccdaed59821bdf1076bdc3866cc956
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, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 29 Aug 2019 13:06:32 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
59716
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:48 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=1568187288126&__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
Wed, 11 Sep 2019 07:34:48 GMT
Last-Modified
Thu, 03 Sep 2009 07:34:24 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
Wed, 05 Sep 2012 07:34:24 GMT
collect
www.google-analytics.com/r/
35 B
101 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=709463747&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=556966631&gjid=1032615273&cid=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&_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=747857454
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:825::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
Wed, 11 Sep 2019 07:34:48 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
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=800166598
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 83D0
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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
last-modified
Tue, 27 Aug 2019 09:58:54 GMT
server
nginx/1.14.1
etag
W/"5d64fede-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 83D0
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
Wed, 11 Sep 2019 07:34:48 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
Tue, 10 Dec 2019 07:34:48 GMT
rum.js
pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/
49 KB
19 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/rum.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
9b404c617f947b58e4c257e9d622512567b05283f1ce4894b11273982c534f71
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
Fri, 06 Sep 2019 10:36:30 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
421098
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
19002
x-xss-protection
0
server
cafe
etag
16639907700459338416
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Fri, 20 Sep 2019 10:36:30 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 1173
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=1568187288&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&dt=1568187288003&bpp=9&bdt=170&fdt=208&idt=208&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&correlator=8223080048408&frm=20&pv=2&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=2251851893044128&dssz=62&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=20199335%2C21060078&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&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0yT4laeFmO&p=https%3A//www.giga.de&dtd=226
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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=1568187288&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&dt=1568187288003&bpp=9&bdt=170&fdt=208&idt=208&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&correlator=8223080048408&frm=20&pv=2&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=2251851893044128&dssz=62&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=20199335%2C21060078&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&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0yT4laeFmO&p=https%3A//www.giga.de&dtd=226
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
IDE=AHWqTUkP5hEBpBvoosU4dBCiCl9VZgRGtcbdydlyKzshIdQeavLEPQfK0VIRG731
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
Wed, 11 Sep 2019 07:34:48 GMT
server
cafe
content-length
22323
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
osd.js
www.googletagservices.com/activeview/js/current/
76 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
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, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1568027754411643"
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
28408
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:48 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-cf939aa283.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
Wed, 11 Sep 2019 07:34:48 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
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
50 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
853c392f2bdc84af0e62dabea07eae48b8295da0c1fdfd86164f977ba7fbc70d

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 07:34:48 GMT
Content-Encoding
gzip
Age
335
X-Cache
HIT
Connection
keep-alive
Content-Length
12601
x-amz-id-2
ckIfF+RCK8QnpEpANNYTDfekRur6wOJoSHJBRF/aTVxkYbSRQmBVgi6V/jc1EAEltWqcCH80G1k=
X-Served-By
cache-fra19180-FRA
Last-Modified
Wed, 11 Sep 2019 05:46:20 GMT
Server
AmazonS3
X-Timer
S1568187288.293543,VS0,VE0
ETag
"6fa0cfd3877b73afcc4d249a0706c4c4"
x-amz-request-id
F1FFEC7AA1171DD6
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
614
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-cf939aa283.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-00thVLYa1hfGmULKdwKOdg' '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
Wed, 11 Sep 2019 07:34:48 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-4c71d5d921.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
AmazonS3 /
Resource Hash
834aadbf7daffdd4fb668c28184b5a36bf86d64eb33d264abcbc5512a96019f8

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
Ne.6.akiVMK7vCIz8B1x0LT1aVxhdfch
content-encoding
gzip
etag
"ab774eb48fe3d7bf54b8a7838b25128e"
age
120
x-cache
HIT
status
200
content-length
22068
x-amz-id-2
vlAr+ZjHAhNUp3kA0xU+UI5I9kNyYRcTZczWZ2VSVYPtbLXc1m/yS7scDpjsyMFDwksPUz3TgZE=
x-served-by
cache-hhn4044-HHN
last-modified
Sun, 08 Sep 2019 14:22:59 GMT
server
AmazonS3
x-timer
S1568187288.281201,VS0,VE1
date
Wed, 11 Sep 2019 07:34:48 GMT
vary
Accept-Encoding
x-amz-request-id
27B0F94CDB699AC7
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
34
x-cache-hits
1
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=1480758500
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=1086000241
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=922244624
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=1618141652
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=422699613
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=873904352
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=1689286737
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
googleads.g.doubleclick.net/pagead/ Frame 3AEA
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1568187288&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=1568187288012&bpp=5&bdt=180&fdt=266&idt=266&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=8223080048408&frm=20&pv=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=3333078966304&dssz=68&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=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060078&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&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=271
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::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=1568187288&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=1568187288012&bpp=5&bdt=180&fdt=266&idt=266&shv=r20190905&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=8223080048408&frm=20&pv=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&ga_fc=0&iag=0&icsg=3333078966304&dssz=68&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=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335%2C21060078&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&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=271
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
IDE=AHWqTUkP5hEBpBvoosU4dBCiCl9VZgRGtcbdydlyKzshIdQeavLEPQfK0VIRG731
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
Wed, 11 Sep 2019 07:34:48 GMT
server
cafe
content-length
0
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
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-cf939aa283.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::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
Wed, 28 Aug 2019 22:54:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
1154445
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
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
Thu, 27 Aug 2020 22:54:03 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame 043C
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=A_ea9vQaFUlZsCh6FfVUp24|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
Wed, 11 Sep 2019 07:34:48 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=A_ea9vQaFUlZsCh6FfVUp24; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 07:34:48 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 07:34:48 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Wed, 11 Sep 2019 07:34:48 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=A_ea9vQaFUlZsCh6FfVUp24|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 07:34:48 GMT; Path=/; HttpOnly
Vary
User-Agent
sync
ap.lijit.com/ Frame E041
49 KB
16 KB
Script
General
Full URL
https://ap.lijit.com/sync
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
c959d175ccf2a5f270b3ec797d22c21c2fb414e5ddb0c4e7d18cf8e7c3e13e14

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 07:34:48 GMT
Content-Encoding
gzip
Last-Modified
Wed, 12 Jun 2019 23:43:14 GMT
Server
nginx
ETag
W/"5d018e12-c373"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=86400, must-revalidate
Transfer-Encoding
chunked
X-Sovrn-Pod
ap3ams1
Expires
Thu, 12 Sep 2019 07:34:48 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-cf939aa283.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:18:52 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:18:52 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=386873145
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
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.289a9882b578f36829997a593f422307.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
Wed, 11 Sep 2019 07:34:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 10 Sep 2019 12:21:44 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
Thu, 12 Sep 2019 07:34:48 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=7286246159041568187288062&cb=7549509718361568187288331&ws=1600x1200&v=7.36.00&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
143.204.211.231 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-211-231.fra53.r.cloudfront.net
Software
Server /
Resource Hash
d660ab84478e30350d7dc1aafa87d4eb646645dcd4026f181afd3b10c20db666

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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA53-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
132
via
1.1 16dc09493f48bbc1fd2cdd6e175a94f7.cloudfront.net (CloudFront)
x-amz-cf-id
_HDf09UuLeqh5Xe7BFNXHA_cpv8lyrBrD5Jrd2C7KuP1n_AbMyIh2g==
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.216 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
312.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
13fb263462e11a1a4634467a9070505f3737e03b94a6fb0b42dda0c43ab53f37
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
Wed, 11 Sep 2019 07:34:50 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; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.75:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
46b202bc-d782-4692-a721-139a13808d84
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
fastlane.json
fastlane.rubiconproject.com/a/api/
240 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=750960&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=76992fa3-469d-4736-a114-a2737cc162ab&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.956746359255878
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
1b00a5cb16c91a06ace93e2b1bafe7394f3bbeff13b2fcd6ed53f5207e1c9e20

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
Wed, 11 Sep 2019 07:34:48 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=431
Content-Length
240
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1266838&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=47f3a270-254a-411d-a6ae-21a81288eea8&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.0419986799788592
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
5f05a28af8bfc36985245f09034fd8de6794a7deb250aa4476af6569289724b7

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
Wed, 11 Sep 2019 07:34:48 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=434
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=156224&zone_id=1408756&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=755e5f0a-0f18-4f89-8688-62419c3674cf&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.16370437656178183
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
a8c233789a814228dc9a80d5a95832045d56912283efa70435e8d3a006404d68

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
Wed, 11 Sep 2019 07:34:48 GMT
Server
RAS 2.4
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
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=345
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 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=76992fa3-469d-4736-a114-a2737cc162ab%2C47f3a270-254a-411d-a6ae-21a81288eea8%2C755e5f0a-0f18-4f89-8688-62419c3674cf&nocache=1568187288340&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.161.0 /
Resource Hash
a1077ea2c782ef0d45b33880c7ba1fee42a42b145984a64496425d35fbc5284b

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
Wed, 11 Sep 2019 07:34:48 GMT
via
1.1 google
server
OXGW/16.161.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
4412
expires
Mon, 26 Jul 1997 05:00:00 GMT
translator
hbopenbid.pubmatic.com/
0
113 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

status
204
date
Wed, 11 Sep 2019 07:34:48 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
/
adx.adform.net/adx/
2 KB
2 KB
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTY2NjQ0MyZ0cmFuc2FjdGlvbklkPTc2OTkyZmEzLTQ2OWQtNDczNi1hMTE0LWEyNzM3Y2MxNjJhYg%3D%3D&bWlkPTcwNjE1MSZ0cmFuc2FjdGlvbklkPTc1NWU1ZjBhLTBmMTgtNGY4OS04Njg4LTYyNDE5YzM2NzRjZg%3D%3D&pt=gross&stid=ffa61990-3905-464a-bc0e-3f1c2333f94e&fd=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
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
20344f6c2576e888645689814108b6019491071d53d5f4b3edc294951a5de023

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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
server
nginx
status
200
vary
Accept-Encoding
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
https://www.giga.de
access-control-max-age
86400
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
application/json; charset=utf-8
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1
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=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C800x450%7C580x500&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%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%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-2%252Cn71-7%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%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288373&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2241380529&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=71&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
58d9efad2053d80cdfa268429487416fad20a6366343f48c47e8aa8437d7e584
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
Wed, 11 Sep 2019 07:34:48 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
4642
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_2019082901.js
securepubads.g.doubleclick.net/gpt/
66 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
05e529a757d25aa9d160d28e57c20041eee3f973870c0f0ad4ac7c21937254b1
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, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 29 Aug 2019 13:06:32 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
25315
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:48 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
0
0

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=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&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%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%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-2%252Cn71-7%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%26keywords%3D%26amznbid%3D0%26amznp%3D0%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288387&dlt=1568187287832&idt=523&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=72&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=640&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
052da30de87681d138df57ad1bf5705fcf879ee1e80cb1cb2e4ced21c1712c91
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
Wed, 11 Sep 2019 07:34:48 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
1766
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
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=1159
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1159
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
Wed, 11 Sep 2019 07:34:48 GMT
via
1.1 google
cf-cache-status
HIT
age
59683
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
5147f6188b1acbcc-VIE
expires
Thu, 10 Sep 2020 07:34:48 GMT
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 83D0
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
185573
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
impl.20190908-6-RELEASE.js
cdn.taboola.com/libtrc/
393 KB
111 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20190908-6-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.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
7ca541ae05839ff79554d3430282e15191cad0039ffac352ac85c5eb0cc59f22

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
j1WkKGYm01NynykKaCRHv2i18NO0auYy
content-encoding
gzip
etag
"9675daad175c880ea294ad20d8ede3b8"
age
39
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
113683
x-amz-id-2
wJUkNW+D/ZKeKsribsifoFripS+ITBG80+JFZRhYIAbRvNTQJaVny64d44Qq/3FTA0UHXHsMClE=
x-served-by
cache-hhn4044-HHN
last-modified
Mon, 09 Sep 2019 13:55:30 GMT
server
AmazonS3
x-timer
S1568187288.488466,VS0,VE0
date
Wed, 11 Sep 2019 07:34:48 GMT
vary
Accept-Encoding
x-amz-request-id
5FB668ACD4F43D53
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
62
x-cache-hits
267
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
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912

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 07:34:48 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
901
Expires
Thu, 12 Sep 2019 07:34:48 GMT
ads
securepubads.g.doubleclick.net/gampad/
15 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180%7C770x250&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%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%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%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-2%252Cn71-7%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%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288516&dlt=1568187287832&idt=523&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2481209206&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=74&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
79345021f111ae91aa428a05560bca86eb37eecf8193fb7fb1ed5b4f9e923002
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
Wed, 11 Sep 2019 07:34:48 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
4843
x-xss-protection
0
google-lineitem-id
5137180976
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138284811686
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=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&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%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%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-2%252Cn71-7%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%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288523&dlt=1568187287832&idt=523&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=74&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
ff979ff06519d05cc49427b9ab4e5ac99ff71d4eddb15c935f0edc30dbd540ca
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
Wed, 11 Sep 2019 07:34:48 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
3779
x-xss-protection
0
google-lineitem-id
5137180976
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138285141073
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=3513080229395773&correlator=3286607760933763&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21063048&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&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%3D20%26smb-hour%3D9%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26mbrid%3De31d4beb14948a7bc188c1d3a9a51832%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%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-2%252Cn71-7%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%26keywords%3D%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1568187288&dt=1568187288532&dlt=1568187287832&idt=523&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=74&icsg=213317053842208&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&blev=1&bisch=1&ga_vid=2009388133.1568187288&ga_sid=1568187288&ga_hid=709463747&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
2a6a6a1287ae0f8efc05591091b90426e98c0ca24e926301086f7bce17cd9423
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
Wed, 11 Sep 2019 07:34:49 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
3248
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
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=134042310
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139650
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
f44af6f7-d6b7-484b-872c-66c6b18a2885
https://videos.giga.de/ Frame 83D0
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/f44af6f7-d6b7-484b-872c-66c6b18a2885
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
BLOB
Security
, ,
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 83D0
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.73.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
Wed, 11 Sep 2019 07:34:49 GMT
Last-Modified
Wed, 11 Sep 2019 04:42:17 GMT
Server
AmazonS3
x-amz-request-id
104D9887A61E8648
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
tkE1HxTcDrFtnVQmUx+VP7RXotgJJzVL8DpYjzopz9YcstMb6LyX/8ZSVLBKzeDhgvZL0L1A3kA=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 83D0
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
Wed, 11 Sep 2019 07:34:48 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
Wed, 11 Sep 2019 07:49:48 GMT
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201908291025/
25 KB
10 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/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
92f5fdb2be157bac1c050ae74fdd9269b35c817ea16931ae9998c2dc27bfd0c4

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 07:34:48 GMT
Content-Encoding
gzip
Age
355
X-Cache
HIT
Connection
keep-alive
Content-Length
9685
x-amz-id-2
Z451ZjRx0clUBlbhHxF4OWNNHLAqfdH0MUbAv1KpevOdVFFRHhFkyqP9OT/PsklOymVDc8hcEVs=
X-Served-By
cache-fra19180-FRA
Last-Modified
Thu, 05 Sep 2019 08:57:02 GMT
Server
AmazonS3
X-Timer
S1568187289.599396,VS0,VE0
ETag
"7f7e66db4764de508e8dad93ad2d0d27"
x-amz-request-id
4642F86B21EEF1EC
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
455
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-cf939aa283.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
Wed, 11 Sep 2019 07:34:48 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
adcfg
ap.lijit.com/ Frame E041
158 B
566 B
Script
General
Full URL
https://ap.lijit.com/adcfg?zoneid=600632&tid=d4edd17035c04be3b20a42f630a4ee6784969245&mode=1&dmn=www.giga.de
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
b42f76007502ed6288ff212f62afa2f3d74d5cd988bf2a7fc921b62e1f67e9c9

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 07:34:48 GMT
Content-Encoding
gzip
Server
nginx
Transfer-Encoding
chunked
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, DELETE, PUT
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
X-Sovrn-Pod
ap3ams1
Access-Control-Allow-Headers
X-Requested-With, Content-Type
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 83D0
650 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
143.204.214.60 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-60.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f

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
Wed, 11 Sep 2019 07:34:48 GMT
Via
1.1 0cbb1ca51bf146be48b40804581e4466.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA53-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
650
Last-Modified
Thu, 22 Aug 2019 19:35:49 GMT
Server
AmazonS3
ETag
"5fc4deddff2532151bd956c4931604f7"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
wOlrtZelVJRM1PSpwx1aGfFqZDTz7bP2lO6xGWdzoWrHsFZwfPsTJw==
Expires
0
container
tracking.m6r.eu/pixel/
0
376 B
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=2&n71=7&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: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
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
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
Wed, 11 Sep 2019 07:34:48 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
0
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
view
securepubads.g.doubleclick.net/pcs/ Frame 53DA
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvJZVnYKtZj0Pfj0E6LXkl2WrnpwopoKHnKElcZ_Dhr92Yug3lFdgTdQ4Cw6ksXlo1LjOEjoQCdcKwItZcvzF-1qHS_QuOTfKjKgYvNQthn9SUbC0XsJT5Zax0Mn5rN4hAkMj6WETvDBnLvEoP42CPykYJpkzNXjRenC5WmrX2SsGUUnR7BWMAssZK4lmbCTI0U7JXQua-pvQPuPdx_pyki7Hu5Il7uexV5RDK_aHamwxGtH8pDFQH7WsxKKLOmmp6hUTnFY080tUVJOGuSbMnZlw&sig=Cg0ArKJSzITv7D8St8ZlEAE&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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-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
Wed, 11 Sep 2019 07:34:48 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 53DA
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
Wed, 11 Sep 2019 07:34:48 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 53DA
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
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, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1568027754411643"
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
28564
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:48 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=800x450%7C800x450%7C580x500&w=800&h=450
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:825::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
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

pragma
no-cache
date
Wed, 11 Sep 2019 07:34:48 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame FF8F
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvY9ZFUxVLpuDhS-SCvHcaweRY3udbl4lKF8rRVvCXLhnKqM7RIHC03wf8-xtlX4SHXI84XwFUx2VYznKIHrr2hYwGTIFeXonbIkoCOAxySc_V4hoOhpOajTmKUzB8UtuJX0LnqYqOiT...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
343 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
Wed, 11 Sep 2019 07:34:48 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=207230
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Fri, 13 Sep 2019 17:08:38 GMT

Redirect headers

timing-allow-origin
*
date
Wed, 11 Sep 2019 07:34:48 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
/
d.nativendo.de/cds/delivery/get/
7 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=1159
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
040a656163007312458fb5e23d55742ce8ef233859301c70be4e31f317d5fa5c

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
Wed, 11 Sep 2019 07:34:48 GMT
content-encoding
gzip
last-modified
Wed, 11 Sep 2019 07:34:48 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
1686
via
1.1 google
expires
Sat, 26 Jul 1997 05: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=09%3A34%3A48.805&lti=deflated&data=%7B%22id%22%3A29%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%3A1568187288797%2C%22cv%22%3A%2220190908-6-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.20190908-6-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
567d96c9d8b08252cc609253eb57ad5ae304f8f3b5da57ca6ed9f0d3b7d84b02

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 07:34:49 GMT
content-encoding
gzip
server
nginx
x-timer
S1568187289.857310,VS0,VE304
status
200
x-served-by
cache-hhn4044-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
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1568187288852&ns_c=UTF-8&cv=3.1&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=1568187288852&ns_c=UTF-8&cv=3.1&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1568187288852&ns_c=UTF-8&cv=3.1&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
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.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
Wed, 11 Sep 2019 07:34:48 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=1568187288852&ns_c=UTF-8&cv=3.1&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
Wed, 11 Sep 2019 07:34:48 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
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 83D0
202 KB
59 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=PcvnjDcCle
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
143.204.214.60 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-60.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
e735362ed82fa26fdc228818a71a3a51a6981be6ef0057a90167f183942b8011

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
Wed, 11 Sep 2019 07:34:08 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
74
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 06 Sep 2019 14:39:36 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 0cbb1ca51bf146be48b40804581e4466.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA53-C1
X-Amz-Cf-Id
0GIV7ZjIbEYCWn816quDh_Xh7u9ccSaxv6lbp20wFRvtUDsAMuSNaw==
addelivery
ap.lijit.com/ Frame E041
4 KB
2 KB
Script
General
Full URL
https://ap.lijit.com/addelivery?zoneid=600632&tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&cb=29807265&mode=1&flv=0.0.0&ifr=true&od=www.giga.de&time=07%3A34%3A48&fd=1&be=sf&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&orig_loc=http%3A%2F%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&abf=true&dpz=false&cv=7a34ad2&dop=0&ndw=1&spif=true&btid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&iv=sf
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
0cd88df3a26fa65f5e8a2a0a47829afaed5017169f83145500aa3ebb0c52de60

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 07:34:48 GMT
Content-Encoding
gzip
Server
nginx
Transfer-Encoding
chunked
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, DELETE, PUT
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
X-Sovrn-Pod
ap3ams1
Access-Control-Allow-Headers
X-Requested-With, Content-Type
native
native.adscale.de/
157 B
602 B
XHR
General
Full URL
https://native.adscale.de/native
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1159
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.111.246.233 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-246-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8ac7d704a20f1e1c52694126df1a3d17ae2c0ee5f759d76a21ef2ee32512712e

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;charset=UTF-8

Response headers

Date
Wed, 11 Sep 2019 07:34:49 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
le.php
media.oadts.com/www/delivery/ Frame 53DA
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=344867612
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
Wed, 11 Sep 2019 07:34:48 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 53DA
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=33515804738
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
Wed, 11 Sep 2019 07:34:48 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 53DA
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=63350843964
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
Wed, 11 Sep 2019 07:34:48 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
truncated
/ Frame 83D0
202 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e735362ed82fa26fdc228818a71a3a51a6981be6ef0057a90167f183942b8011

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
view
securepubads.g.doubleclick.net/pcs/ Frame F2DF
0
48 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv-D496jGRwqnK0dOOf4InVGHaWpr3kG2qm-MXrZKybHe0qdBmLK-3beR1gkK0bh-y56F8ghzwnMYZLbMP7gKMfl4L6beIwv3wkfwzMcaVJDM-EsMtlyoLYDq21C1LlBdTU4OPnyYVCufM9mEwXQay36Wjko8PcTq07lx-B8pwJKQgYf_2KZGehXHFcTQ5URJWT7U2IPqrNxHv6mf-K8uZdgQzzZV-Vhb9GbeY_JN6z80DNKlvhtQL4LObztyM4WAf2UnPM3A_CSAOLBOjmB_q-tUeLgtJ1_nXRWoqjut1t&sig=Cg0ArKJSzH2bAXM2__gDEAE&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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-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
Wed, 11 Sep 2019 07:34:48 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
/
track.adform.net/adfscript/ Frame 111E
0
0
Document
General
Full URL
https://track.adform.net/adfscript/?bn=31959167;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.40 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
track.adform.net
:scheme
https
:path
/adfscript/?bn=31959167;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
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
server
nginx
date
Wed, 11 Sep 2019 07:34:49 GMT
content-type
text/html; charset=utf-8
cache-control
no-cache, no-store, must-revalidate, no-transform
pragma
no-cache
content-encoding
gzip
expires
-1
vary
Accept-Encoding
access-control-allow-origin
*
set-cookie
C=1; expires=Fri, 11-Oct-2019 07:34:49 GMT; path=/ adtrc=1; domain=adform.net; expires=Wed, 18-Sep-2019 07:34:49 GMT; path=/
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
/
track.adform.net/adfscript/ Frame CD11
0
0
Document
General
Full URL
https://track.adform.net/adfscript/?bn=31959168;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.40 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
track.adform.net
:scheme
https
:path
/adfscript/?bn=31959168;click=https://adclick.g.doubleclick.net/pcs/click?xai=AKAOjssJK6EEeejlNJCEmdhFypDBpYbwC9w-cowJzB0h12BkfZKLiAx1B8Uv_tzzvMvD5OcnDuCwSV5TDPf-qmBvaZTTxIKbqvCH-YWf4_mxekFcvYMYdncatIFslfFC3lpjFPNy7BsYHtJ2lscjj1dVRGuDTH0PPp0xc-4ps1E5q_3A7W3vsM7SgQwXzfm8jqruptivW10CaguNevWMKuMIKa14tR9lkQILVbmNhnFvZmCDBH_yB-rs_lUPpmM_u2GQjpNBDT84YEfOkeLW-Q&sig=Cg0ArKJSzKxYRGa_ePr9EAE&urlfix=1&adurl=;cpjs=2;ord=1841080514
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
server
nginx
date
Wed, 11 Sep 2019 07:34:49 GMT
content-type
text/html; charset=utf-8
cache-control
no-cache, no-store, must-revalidate, no-transform
pragma
no-cache
content-encoding
gzip
expires
-1
vary
Accept-Encoding
access-control-allow-origin
*
set-cookie
C=1; expires=Fri, 11-Oct-2019 07:34:49 GMT; path=/ adtrc=1; domain=adform.net; expires=Wed, 18-Sep-2019 07:34:49 GMT; path=/
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame F2DF
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
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, 11 Sep 2019 07:34:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1568027754411643"
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
28564
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:49 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame E788
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss8cohc6935sGBJBdG_OEqJasPIhxzXCzmELP8y0ho-N5_hcnnm_6Ah_luQvi_BwWGhRHn5uZnneB_o5Q92E0eF_nvjkjqHHravm_pq3QaKIfmgrqzA5i-MyPhEbxuASwfGlnvqjdPc5VvAjbCeEbAjdAg9Kbh5lOty9lExSq1Q431jgcPRift7c56OVlSDqeGKUbD00aZEoXOeS3AiaiWVqiHgyW5rLdd1l4k9LuVhQ9FX-AaDQkpc3lhRAlwDEcatj3vzhp4v3IH9WRG_quuWxSnPpaOTkvpnTAh5gJfU&sig=Cg0ArKJSzLXRF2YWfomLEAE&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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-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
Wed, 11 Sep 2019 07:34:49 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 E788
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
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, 11 Sep 2019 07:34:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1568027754411643"
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
28564
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:49 GMT
avc.php
media.oadts.com/www/delivery/ Frame 53DA
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=atg1852701908&startmuted=1&cb=0.15794928716366452&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
7d06f4e5f7a31127824b0a4aa02b95910f8282233a3cdb043b96f0d271f19b41

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
Wed, 11 Sep 2019 07:34:49 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 53DA
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=62625666199
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
Wed, 11 Sep 2019 07:34:49 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
5002100619
dfp-gateway.s-onetag.com/1/4444/
109 B
574 B
XHR
General
Full URL
https://dfp-gateway.s-onetag.com/1/4444/5002100619
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:5e00:a:52eb:a100:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
3b1011d0eada4c1977bc4c2d1036d1d4618c4361e870bcd81057e60fd5771d9b

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
Wed, 11 Sep 2019 07:10:25 GMT
via
1.1 a350f357b825293e306b1b0a2cb490c1.cloudfront.net (CloudFront), 1.1 e430a35037c484cf19f375480cabfca3.cloudfront.net (CloudFront)
age
1464
x-amzn-requestid
94a582f9-bcbd-4043-8d35-a4702b97e41c
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600, public
x-amzn-trace-id
Root=1-5d789de1-d87e21cd9d93b1f39ff7d2e9;Sampled=0
x-amz-cf-pop
FRA6-C1, FRA56
x-amz-apigw-id
f12bRFIYSK4Fukw=
content-length
109
x-amz-cf-id
e0Xf_rv_OSZiYrphs4N5lyN5E0EvXjKTEz4SCpxmXJFSO2CVvZTv3A==
4482388292
dfp-gateway.s-onetag.com/1/4444/
111 B
575 B
XHR
General
Full URL
https://dfp-gateway.s-onetag.com/1/4444/4482388292
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:5e00:a:52eb:a100:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
3e82f5310fe957108f5b1f2c3c701763f296b335802dbc630704331974feb40c

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
Wed, 11 Sep 2019 06:36:56 GMT
via
1.1 2f471134491a4de5cfcaef646caf9dde.cloudfront.net (CloudFront), 1.1 e430a35037c484cf19f375480cabfca3.cloudfront.net (CloudFront)
age
3473
x-amzn-requestid
9fcfb7f4-8f1c-4c9d-8b16-86b9154eff61
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600, public
x-amzn-trace-id
Root=1-5d789608-e216ff802ba712f75f90c0c7;Sampled=0
x-amz-cf-pop
FRA6-C1, FRA56
x-amz-apigw-id
f1xhWHfyyK4FSkQ=
content-length
111
x-amz-cf-id
lPFvYfiQtm1dUlz3KwlKcf9uTcGTlqlXgJ_z8w-SDgArhoLY1k4deA==
5137180976
dfp-gateway.s-onetag.com/1/4444/
114 B
579 B
XHR
General
Full URL
https://dfp-gateway.s-onetag.com/1/4444/5137180976
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:5e00:a:52eb:a100:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
3ddb12be58c8d1e4f15ed6bd23266bbcb098846570ef8fcfd819be9af32ea25c

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
Wed, 11 Sep 2019 06:59:29 GMT
via
1.1 d8e97d2c28917e4c41ab79bb1e94b845.cloudfront.net (CloudFront), 1.1 e430a35037c484cf19f375480cabfca3.cloudfront.net (CloudFront)
age
2120
x-amzn-requestid
e925fd5b-8035-44d9-9f11-adf492de1b36
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600, public
x-amzn-trace-id
Root=1-5d789b51-ff3925b1a8049d9569185690;Sampled=0
x-amz-cf-pop
FRA6-C1, FRA56
x-amz-apigw-id
f100rHrYyK4FSpQ=
content-length
114
x-amz-cf-id
Wxd55SzDcCj71QxsVEt6vuHdxynO352rXR4bE9zDZiB_dEyubbYkVA==
sovrn_standalone_beacon.js
ap.lijit.com/www/sovrn_beacon_standalone/ Frame E041
4 KB
2 KB
Script
General
Full URL
https://ap.lijit.com/www/sovrn_beacon_standalone/sovrn_standalone_beacon.js?iid=13413818
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
5f7c7709d592c7e19dc12152d7adce8a117f08af40a2facd69c19b495c9a1047

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 07:34:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 08 Jan 2019 18:24:08 GMT
Server
nginx
ETag
W/"5c34eac8-fb6"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Type
text/javascript
Cache-Control
max-age=604800, must-revalidate
Transfer-Encoding
chunked
X-Sovrn-Pod
ap3ams1
Access-Control-Allow-Headers
DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Access-Control-Allow-Credentials
true
Expires
Wed, 18 Sep 2019 07:34:49 GMT
getAd
video-adserver.ibillboard.com/ Frame 53DA
1 KB
1 KB
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=8f885e3cee&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.126 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
bbnaut2.bbelements.com
Software
ibillboard /
Resource Hash
f24cf6322865cc2eff1d20b7cfb90b05a3b32a4054ecd7f92c64f15ca16029d6

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
Wed, 11 Sep 2019 07:34:49 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 53DA
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.5914514780747686&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=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
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
Wed, 11 Sep 2019 07:34:49 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
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/201908291025/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
Wed, 11 Sep 2019 07:34:49 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
IdaVAl1604pfq6JwXhPQZmq7SpSyJoUJfwVVhRXUnMBWynW8rBQqVfzyqc7y5KqDybLXGD8qdIs=
0
d.nativendo.de/cds/delivery/render/54fci680/182yo/2oidc/4c7pc/
4 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/54fci680/182yo/2oidc/4c7pc/0
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/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
e86768edbadf843426e0dc7081f579c2df36d45b031aaa6ef2df1f6bd88c8266

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
Wed, 11 Sep 2019 07:34:49 GMT
content-encoding
gzip
last-modified
Wed, 11 Sep 2019 07:34:49 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
1387
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
63ff9320-c4ad-4d4f-83ac-67defc2b6508
t.nativendo.de/cds/tracking/event/
0
195 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/63ff9320-c4ad-4d4f-83ac-67defc2b6508?aid=182yo&floor=NjNmZjkzMjAtYzRhZC00ZA_2h5qu4x73NIA8lA&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=1568187289
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 google
last-modified
Wed, 11 Sep 2019 07:34:49 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
view
securepubads.g.doubleclick.net/pcs/ Frame 03CB
0
58 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssoaSDU-E6LW84h8FSEsKQWoT08GXOCpjOWQ-TV5R_ioVoRcp9b3_MK-_Fmdk6iYbTdZnrOE1N0ixyzQwLJzSIGDetYQQa6vivAYa6y897amEmYBcLSb8x3YFWR2YX8a_o-NCRUmMiMrPB0vUnVg9dOwEE0unlZus7e9Be2vGYwtINE_XsZwBl9vd27JCqPTqcFRm3BOlht0Gft8awfRGkh0KJA98znmDrZ1rTPAPlfC97VjKvMcNB_WqZNU4ZXek5tF_w1wQmqc1O2KWcVmpFcOZPc6XgAH3Ec1OJM&sig=Cg0ArKJSzEr8StyIKcGAEAE&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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-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
Wed, 11 Sep 2019 07:34:49 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 03CB
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_2019082901.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
69.16.175.10 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
Wed, 11 Sep 2019 07:34:49 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=44911
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
1568187289.dop004.fr8.t,1568187289.cds061.fr8.shn,1568187289.cds061.fr8.c
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 03CB
75 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
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, 11 Sep 2019 07:34:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1568027754411643"
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
28564
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:49 GMT
5005878418
dfp-gateway.s-onetag.com/1/4444/
113 B
577 B
XHR
General
Full URL
https://dfp-gateway.s-onetag.com/1/4444/5005878418
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:5e00:a:52eb:a100:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
f2f6180a65038b9ef6eb958ba11c1d049f52081b6550dc396c4f0a887f31a61f

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
Wed, 11 Sep 2019 06:50:12 GMT
via
1.1 d357d5d597708d2b41e0fea397aa2620.cloudfront.net (CloudFront), 1.1 e430a35037c484cf19f375480cabfca3.cloudfront.net (CloudFront)
age
2677
x-amzn-requestid
04af9181-305a-44e0-9e7e-66e965255552
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600, public
x-amzn-trace-id
Root=1-5d789924-9b490178dd1c9f5c2e548010;Sampled=0
x-amz-cf-pop
FRA6-C1, FRA56
x-amz-apigw-id
f1zdpH9FSK4FTFw=
content-length
113
x-amz-cf-id
KJp2NAqXEzPCI8NGn9ri60Hy1euwMvwUr9T5-NM1DAzLwFFm4bg8bQ==
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8DJRAAKktFLkqFFlqwF23A52AwwA/k0FGEmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zALlnFBUkzF2BPdPAAAAAAABgcjAPCAAFAAgcjTA5iAPAAAAAAAAABA5iAZBAAOA55A55A85B55A58E55A55AGAx0A1xA40ArA5iAPjBAAAAAAAPA5iAPAAAAAAAAAIA5iASksFSFjAAAAAAAAAAAAEAAAgcjAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0tBvmFtwEhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0tBvmFtwEhnFlBFdAAAAAAAAAAAAFAAAA5iAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFXWnJUA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8ELRAA/k0FHImvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwBELlnFCTkzFtPFAAAAAAAABS1kAPBAAFAAS1kTtadAPAAAFAAS1kTkMnASksFMEjAAAAAAAAAAAAEAAAS1kAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA40A4xAx2A42AGAkpFylFj0FAAAAIA0zA2yA5xA31AKA1xAz3Ax4Aw5A32AGAihFuuFlyFKA1xAz3Ax4Aw5A32AKA1xAz3Ax4Aw5A32AwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFQtjFekEWVA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8FNRAAUkzFwCPBAA1IASCABtadAZAAAOA55A55A85B55A58E55A55AGAx1Aw4A22ArtadAPBAANUASCABkMnAZAAAOA55A55A85B55A58E55A55AGAx1Aw4A22ArkMnAPAAAKV0AAAjtadAPBAAAAAAAATtadAPAAAKV0AAAjkMnAPAAAAAAAAATkMnASksFuWd1IASCAYLAaBAFAAAtadAAA+Go0F0wFz6BvvA0yFhjFruBhkFmvFytFuuEl0FvhEkmFzjFypFw0Fv/AiuF9zAx5A15Ax2A37AjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzFzKFL2BFFFllFqsFOKFDFFtkFoGF5wFECFwZFi3FD5B3tBjvF3KF6CFwoExyACrFmaFLMFpBF4xBC4BV2Ff0F66F2NF2EF1PEjuFE1FD3FTWF1UEEQFmtBxtFC2FhaFUUF4JFLiFx2FDIFtZEXmF0fEt4FlrFGjF2ZFNZFkuFjhF0JFGzFsmFGDFzsEwqFGQFO5F3CEzZFI0FKyBszFjqFqxBkWFSHF1EFUIFwQEQwFw4EjtB0wEzxBF1BxfFzBE3XEz2EzNF3TEnRF3YF6mFt4BqxFy1Fw0Fp2FXxBwDEhnF1OFl2FXNFL1FNJFLhFx0A0SF5sErRFJMFWiFtOFouFG2FatFDEFCIFf5FCtByzFfsFVQFwtFNfF1yBHRFqwFOCFEUF40AZFFmPFrlFMXFtREmzEpnF9DEnwBByFLKFT6FL4FZSFHhFflFQyF5FEBFFm1EysFmpF49BxmAhkF1yFs9B7jEwqFz9By7AvyFk9Bx4A0xAw4Aw1Ax0AJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAdNUASCAgCAYJAFAAAkMnAAA+Go0F0wFz6BvvA0yFhjFruBhkFmvFytFuuEl0FvhEkmFzjFypFw0Fv/AiuF9zAx5A15Ax2A47AjsFpjFr9Bo0F0wFz6BvvAhkFjsFpjFruBnuBkvF1iFslFjsFpjFruBulF0vBwjFzvBjsFpjFr/B4hFp9BBLFBPFqzFzKFL2BFFFllFqsFOKFDFFtkFoGF5wFECFwZFi3FD5B3tBjvF3KF6CFwoExyACrFmaFLMFpBF4xBC4BV2Ff0F66F2NF2EF1PEjuFE1FD3FTWF1UEEQFmtBxtFC2FhaFUUF4JFLiFx2FDIFtZEXmF0fEt4FlrFGjF2ZFNZFkuFjhF0JFGzFsmFGDFzsEwqFGQFO5F3CEzZFI0FKyBszFjqFqxBkWFSHF1EFUIFwQEQwFw4EjtB0wEzxBF1BxfFzBE3XEz2EzNF3TEnRF3YF6mFt4BqxFy1Fw0Fp2FXxBwDEhnF1OFl2FXNFL1FNJFLhFx0A0SF5sErRFJMFWiFtOFouFG2FatFDEFCIFf5FCtByzFfsFVQFwtFNfF1yBHRFqwFOCFEUF40AZFFmPFrlFMXFtREmzEpnF9DEnwBByFLKFT6FL4FZSFHhFflFQyF5FEBFFm1EysFmpF49BxmAhkF1yFs9B7jEwqFz9By7AvyFk9Bx4A0xAw4Aw1Ax0AJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAQtjF2r74YA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8GQRAA/k0FNMmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwmEvyFthF0jFvkFl9BisFvjFrlFymBhkF29BxwA10A05Ax2A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAwyAxwAw2Ax5AmjEpkF9xAz4Ay2A1wA13A2yA0mAzpF6lF94AwwA40B1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BwvFz0FlyFhkFmhEwjF91AwwAyxAwwA2xA5mAhwFk9B1wAwyAxwAw2Ax5AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGwFvzF0lFyhFkmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5A3BELlnFDTkzF8PAAA1IASCABKV0APAAAFAAS1kTKV0APDAAAAAAAABR3VAPAAAFAAR3VTUOaASksFnFd1IASCA4NAYJAFAAAKV0AOAxyAw0A5zAfxB2wA10A4fEAAJAXhFssFwhFwlFyBFAAAAAAAAAAAAAAAAjAAAAAAAAAAAAEAAAR3VAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHA4wAw4E01AwBEMAxzA4yA21Aw1A32Ay0AGAkpFylFj0FAAAAKAxwA10A05Ax2A11AKA1wAwyAxwAw2Ax5AIAwvFz0FlyFhkFKA1wAwyAxwAw2Ax5AKA1wAwyAxwAw2Ax5AyAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEwvFz0FlyFhkFQtjFSTHxYA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8HaRAATkzF6PAAA/EAAKABUOaAZBAAOA55A55A85B55A58E55A55AFA45A11AzBErUOaARksF3d/EAAKAxJAAAAFAAAUOaAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjF/qjPSA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8IaRAA/k0FHQmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwmEvyFthF0jFvkFl9BisFvjFrlFymBhkF29BxwA10A05Ax2A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAwyAxwAw2Ax5AmjEpkF9xAz4Ay2A1wA13A2yA0mAzpF6lF94AwwA40B1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BwvFz0FlyFhkFmhEwjF91AwwAyxAwwA2xA5mAhwFk9B1wAwyAxwAw2Ax5AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGwFvzF0lFyhFkmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5A3mEvyFthF0jFvkFl9BisFvjFrlFymBhkF29B0zA2yA5xA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xAz3Ax4Aw5A32AmjEpkF9xAz4Ay4A1xA0xAw3AzmAzpF6lF9xAywA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xAz3Ax4Aw5A32AmhEwkF91AxzA3xA4wA53A2mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45AywA3BELlnFETkzFARksFAQtjFudalYA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
Cookie set beacon
gslbeacon.lijit.com/ Frame D812
0
0
Document
General
Full URL
https://gslbeacon.lijit.com/beacon?viewId=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&rand=5462&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&v=1.2
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
Resource Hash

Request headers

Host
gslbeacon.lijit.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
ljt_reader=de2e0b8c7ff08336dcad6b3e
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
Date
Wed, 11 Sep 2019 07:34:49 GMT
Content-Type
text/html;charset=utf-8
Transfer-Encoding
chunked
Vary
Accept-Encoding
X-Application-Context
application:prod:9080
Set-Cookie
tpro=eJxNUMtuhDAM%2FBefI%2BTw2i2%2F0b1VVRQFA5FCggJUqlb8e52wi3qb8UzGnjwhbBNF6J7gNjsTdChgDr0yYffbya75D8XVBg8dlAXCISDSQDFaP36SjmZ6UJxX6L6%2BBSwxDNZRyrXehDkjiagWt7MFi%2FImoELV4pu0qFjP7C4AVZWxvPMaE5yjMUdcEItawBh1r1YzZWcjwAd%2FSg2%2FGsn3Z7OBZu2ywJ4Lpvu1OVP1btKMF7%2B%2BAwuUAvQQlZ4zY0mvVvtMOGay65Jxmw6crOsj%2BZTlQ05n%2Fy%2FlpnXJDn2eL%2B%2BqqtOw4vZKlu80yeSWW%2FC8UfXHy9P8%2B7DmOI4%2FvRJ50A%3D%3D;Path=/;Domain=.lijit.com;Expires=Thu, 10-Sep-2020 07:34:49 GMT;Max-Age=31536000 ljtrtb_refresh=false;Path=/;Domain=.lijit.com;Expires=Sun, 15-Sep-2019 07:34:49 GMT;Max-Age=345600 ljtrtbexp=eJxdjjEOgDAMA%2F%2FSmYGkbRLzNcTfK8FCbzzZOvtu1i6boa6o0tF8x4idOxBxwmbnzgP6AV%2FCZ%2BhLKjQmGIbiAyHHguPRhM8%2FLs8eb44%2Fnn9%2BFsqcRu4%3D;Path=/;Domain=.lijit.com;Expires=Thu, 10-Sep-2020 07:34:49 GMT;Max-Age=31536000
Expires
Fri, 20 Mar 2009 00:00:00 GMT
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
Pragma
no-cache
P3P
CP="CUR ADM OUR NOR STA NID"
X-Powered-By
raptor
Content-Encoding
gzip
X-Sovrn-Pod
ap3ams1
containertag
ap.lijit.com/ Frame E041
56 KB
7 KB
Script
General
Full URL
https://ap.lijit.com/containertag?containerId=18&zoneId=600632&v=2
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
Resource Hash
25f14c4ae52c878aa8b971df090c30c53b22fc1934c71535b98c1b64aa5b90e1

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
Wed, 11 Sep 2019 07:34:49 GMT
Content-Encoding
gzip
Server
nginx
X-Powered-By
raptor
Vary
Accept-Encoding
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
Transfer-Encoding
chunked
X-Sovrn-Pod
ap3ams1
Content-Type
text/html;charset=utf-8
X-Application-Context
application:prod:9080
Expires
Fri, 20 Mar 2009 00:00:00 GMT
impression
vap3ams1.lijit.com/addelivery/ Frame E041
43 B
564 B
Image
General
Full URL
https://vap3ams1.lijit.com/addelivery/impression?bannerid=214932&campaignid=232&cb=29807265&tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&zoneid=600632&cids=232&bids=214932&tss=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
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, DELETE, PUT
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
*
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
Access-Control-Allow-Credentials
true
X-Sovrn-Pod
ap3ams1
Content-Type
image/gif
Access-Control-Allow-Headers
X-Requested-With, Content-Type
Content-Length
43
Expires
Fri, 20 Mar 2009 00:00:00 GMT
fp
vap3ams1.lijit.com/data/ Frame E041
43 B
207 B
Image
General
Full URL
https://vap3ams1.lijit.com/data/fp?tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&zoneid=600632&starttime=1568187288661&adcfg=6&adcfg_response=221&addelivery=225&addelivery_response=495&lgfired=554&beacon=558&container=593&EOL=594&ctstart=559&elapsed_ms=594
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
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / podlogging
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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 07:34:49 GMT
Server
nginx
X-Sovrn-Pod
ap3ams1
X-Powered-By
podlogging
Content-Length
43
Content-Type
image/gif
tb
15.taboola.com/
27 KB
27 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=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1568187289275&tagid=&cntry=DE&platform=1&sesid=11f8e7cbc40a23ba3ede232562103614&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1568187288797&geolat=&geoing=&deviceifa=&appid=&sd=v2_11f8e7cbc40a23ba3ede232562103614_b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918_1568187288_1568187288_CNawjgYQrMVBGN2Z_PnRLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=e35db710996eade422f43643e27bb57f&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
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
a04fc6430fced9fbcb030d0affb35b5a022e89da03bb0293b6f11ce5309fd5b3

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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187289.278988,VS0,VE14
machineid
1415
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-hhn4080-HHN
feed-card-placeholder.20190908-6-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20190908-6-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.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
abd092a004e2bc0fe1917450f67546975681dd25ccccff63d26c4ea8f137d5f8

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
HidqPdAzSiD.qN7WfyNthtNpeYEamGCj
content-encoding
gzip
etag
"ba1b7108fe550d89dd7e2ce69cabf7e5"
age
28737
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1288
x-amz-id-2
Joi2QQRJ8F79C9ZP4OTC6JUtEhfZqWQo6J3ZT0z2qA0SuLVublDN/QupFXQvnzgyRMOzD1B+EjY=
x-served-by
cache-hhn4044-HHN
last-modified
Mon, 09 Sep 2019 13:55:48 GMT
server
AmazonS3
x-timer
S1568187289.280329,VS0,VE0
date
Wed, 11 Sep 2019 07:34:49 GMT
vary
Accept-Encoding
x-amz-request-id
742F786A7DE94C40
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
63
x-cache-hits
91454
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.20190908-6-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
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
96
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
BJjvIW2YJ7usoISd69SZPX/6NTPTN5noFXlNaXdIJQu2pelq78Hs6M+JZpk4HG5GauXRsDVaLmk=
x-served-by
cache-hhn4044-HHN
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1568187289.283752,VS0,VE0
date
Wed, 11 Sep 2019 07:34:49 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
420723098F930AB9
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
63
x-cache-hits
177
userx.20190908-6-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20190908-6-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.114.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
1618f085a042d5d629ad5d8de16d4ffe7b8ae3a6188c0a6fabe5a3d0db6bd1b8

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
AHTV.MoutjQ3cvVJh22TMOW1Lr01ATX.
content-encoding
gzip
etag
"b4c072e9696373b72289653d82d85bce"
age
119
x-cache
HIT
status
200
x-amz-replication-status
PENDING
content-length
7735
x-amz-id-2
lqn+MIf7utlZT6kTNDFWEcsuMKthieELTzppdEuXbQbIebhuMLtKRO8wJQcpUtI5TPFgoXvhMcI=
x-served-by
cache-hhn4044-HHN
last-modified
Mon, 09 Sep 2019 13:55:54 GMT
server
AmazonS3
x-timer
S1568187289.293552,VS0,VE0
date
Wed, 11 Sep 2019 07:34:49 GMT
vary
Accept-Encoding
x-amz-request-id
C48184758B89419E
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
63
x-cache-hits
363
sync
rtb.mfadsrvr.com/ul_cb/ Frame 0EBC
Redirect Chain
  • https://rtb.mfadsrvr.com/sync?ssp=taboola
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
43 B
300 B
Image
General
Full URL
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
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
18.196.130.47 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-130-47.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

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
Wed, 11 Sep 2019 07:34:49 GMT
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
Content-Length
43
Content-Type
image/gif

Redirect headers

Location
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
Date
Wed, 11 Sep 2019 07:34:49 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"
/
trc.taboola.com/sg/rubicon-network-display/1/rtb-h/ Frame 0EBC
Redirect Chain
  • https://pixel.rubiconproject.com/exchange/sync.php?p=16698
  • https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
0
0
Image
General
Full URL
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
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
/
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

Redirect headers

Pragma
no-cache
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Location
https://trc.taboola.com/sg/rubicon-network-display/1/rtb-h/?taboola_hm=
Cache-Control
no-cache,no-store,must-revalidate
Content-Type
text/html
content-length
0
X-RPHost
611afce88997db6fdd35eb213e662871
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 0EBC
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=dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY%3D
45 B
103 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY%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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.670558,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4044-HHN

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY%3D
Date
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Connection
close
Etag
"dGnSkwScg-7GMNXESxNDTfzQjZNFZpDA6VBjjJ9fBSY="
Content-Length
0
rtb-h
match.taboola.com/sg/appnexus-network/1/ Frame 0EBC
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=4604369351475478241
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=4604369351475478241&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D4604369351475478241
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=4604369351475478241&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D4604369351475478241
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.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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187290.699232,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN

Redirect headers

date
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.570657,VS0,VE9
x-served-by
cache-hhn4044-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=4604369351475478241&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D4604369351475478241
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/google-network/1/ Frame 0EBC
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=CAESEDoQGUUwCwiguQMJDWkxN28&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3DCAESEDoQGUUwCwiguQMJDWkxN28%26goo...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3DCAESEDoQGUUwCwiguQMJDWkxN28%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.114.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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187290.699308,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN

Redirect headers

date
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.570689,VS0,VE15
x-served-by
cache-hhn4044-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEDoQGUUwCwiguQMJDWkxN28&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3DCAESEDoQGUUwCwiguQMJDWkxN28%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/ Frame 0EBC
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=4604369351475478241
0
49 B
Image
General
Full URL
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=4604369351475478241
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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.594303,VS0,VE8
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4044-HHN

Redirect headers

Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:51 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.249:80
AN-X-Request-Uuid
ad479d80-59e1-450b-9872-15438774f9ca
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=4604369351475478241
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 0EBC
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3Dfd305b20-5c46-47da...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3Dfd305b20-5c46-47da-a4e2-e4ecbab05e91
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.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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187290.765539,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN

Redirect headers

date
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.701269,VS0,VE8
x-served-by
cache-hhn4044-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=fd305b20-5c46-47da-a4e2-e4ecbab05e91&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3Dfd305b20-5c46-47da-a4e2-e4ecbab05e91
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame 0EBC
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D0046f824-1366-4ec1-92...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D0046f824-1366-4ec1-9220-16d00120d950
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.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
Wed, 11 Sep 2019 07:34:50 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187290.064290,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN

Redirect headers

date
Wed, 11 Sep 2019 07:34:50 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.047495,VS0,VE10
x-served-by
cache-hhn4044-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=0046f824-1366-4ec1-9220-16d00120d950&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3D0046f824-1366-4ec1-9220-16d00120d950
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame 0EBC
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
Track001-dc3
Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:48 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 0EBC
0
292 B
Image
General
Full URL
https://cds.taboola.com/?uid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&_r=2192381
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
Wed, 11 Sep 2019 07:34:49 GMT
Via
1.1 varnish
Server
nginx/1.12.2
X-Timer
S1568187290.618540,VS0,VE28
X-Served-By
cache-bwi5021-BWI
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 0EBC
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://pixel.quantserve.com/pixel/p-zLwwakwy-hZw3.gif?idmatch=0&ssp=taboola
  • https://x.bidswitch.net/sync?dsp_id=76&user_group=2&ssp=taboola&gdpr=1&gdpr_consent=&user_id=gS01idV6O4iZcWGE13wvgIFwMYCZLWOJhy93Fw97
  • https://x.bidswitch.net/ul_cb/sync?dsp_id=76&user_group=2&ssp=taboola&gdpr=1&gdpr_consent=&user_id=gS01idV6O4iZcWGE13wvgIFwMYCZLWOJhy93Fw97
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3De3dbde91-3417-4114-be...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3De3dbde91-3417-4114-be09-7ec805382302
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.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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187290.883808,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN

Redirect headers

date
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187290.865976,VS0,VE9
x-served-by
cache-hhn4044-HHN
status
302
x-cache
MISS
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=e3dbde91-3417-4114-be09-7ec805382302&tbid=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918&query=taboola_hm%3De3dbde91-3417-4114-be09-7ec805382302
accept-ranges
bytes
content-length
0
x-cache-hits
0
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=709463747&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=2009388133.1568187288&tid=UA-204785-4&_gid=1006732979.1568187288&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=1670472973
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:825::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
Thu, 29 Aug 2019 03:00:38 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1139651
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
vast
tracking.m6r.eu/sync/ Frame 53DA
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%3D8f885e3cee%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%3D0c7847b4-8941-4e64-bf2f-6ccbc3da1cad
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
2406df3da85e2fe3a84e07b048e0b2a3ff1272af51ea78914d542cca9720a2bf

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
Wed, 11 Sep 2019 07:34:49 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
5005878418
dfp-gateway.s-onetag.com/1/4444/
113 B
576 B
XHR
General
Full URL
https://dfp-gateway.s-onetag.com/1/4444/5005878418
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:5e00:a:52eb:a100:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
f2f6180a65038b9ef6eb958ba11c1d049f52081b6550dc396c4f0a887f31a61f

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
Wed, 11 Sep 2019 06:50:12 GMT
via
1.1 d357d5d597708d2b41e0fea397aa2620.cloudfront.net (CloudFront), 1.1 e430a35037c484cf19f375480cabfca3.cloudfront.net (CloudFront)
age
2677
x-amzn-requestid
04af9181-305a-44e0-9e7e-66e965255552
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600, public
x-amzn-trace-id
Root=1-5d789924-9b490178dd1c9f5c2e548010;Sampled=0
x-amz-cf-pop
FRA6-C1, FRA56
x-amz-apigw-id
f1zdpH9FSK4FTFw=
content-length
113
x-amz-cf-id
sf3obKl5GahkNU9a1bau5Cl7RB5xUE5Ly5kGAobVZ7pYsXibknrYgg==
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
55 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190908-6-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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187289.361230,VS0,VE14
x-served-by
cache-hhn4044-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
70 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190908-6-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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187289.362720,VS0,VE12
x-served-by
cache-hhn4044-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
231 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190908-6-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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187289.362762,VS0,VE9
x-served-by
cache-hhn4044-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?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190908-6-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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
server
nginx
x-timer
S1568187289.363144,VS0,VE9
x-served-by
cache-hhn4044-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
userconnect
ih.adscale.de/
546 B
928 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1568187289362&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
85a61531ef23d17d28f0adc0b3447167e25658d93f8026164e3937442b8b3939

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
Wed, 11 Sep 2019 07:34:49 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
Wed, 11 Sep 2019 07:34:49 GMT
image.jpg
c.nativendo.de/cdn/asset/media/crt/23061/2/3/
24 KB
25 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/23061/2/3/image.jpg?v=1545141776&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
167bcacbd46c5803ae0df7fea4bf75363ee2a7a854226f672ca4431ba241859a

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 07:34:49 GMT
via
1.1 google
cf-cache-status
HIT
age
889397
cf-polished
origSize=27047, status=webp_bigger
status
200
alt-svc
clear
content-length
25070
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
5147f61f6bcacbcc-VIE
expires
Thu, 10 Sep 2020 07:34:49 GMT
63ff9320-c4ad-4d4f-83ac-67defc2b6508
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/63ff9320-c4ad-4d4f-83ac-67defc2b6508?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=1568187289
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 google
last-modified
Wed, 11 Sep 2019 07:34:49 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
extend
bis.cliipa.com/event/ Frame 03CB
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.243.114.159 Ashburn, United States, ASN14618 (AMAZON-AES - Amazon.com, Inc., US),
Reverse DNS
ec2-54-243-114-159.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
Wed, 11 Sep 2019 07:34:50 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 03CB
19 KB
9 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=1568187289554
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.243.119.74 Ashburn, United States, ASN14618 (AMAZON-AES - Amazon.com, Inc., US),
Reverse DNS
ec2-54-243-119-74.compute-1.amazonaws.com
Software
Cowboy /
Resource Hash
bdc68de5e41eec35b166fa018d3fb6522ba56ad797917fdb0804fd13419ba8c1

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
Wed, 11 Sep 2019 07:34:50 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
9087
Via
1.1 vegur
tag.aspx
ml314.com/ Frame E041
26 KB
12 KB
Script
General
Full URL
https://ml314.com/tag.aspx?118
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
52.31.106.135 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-106-135.eu-west-1.compute.amazonaws.com
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
7d655e8cd62ba58d86b3bc9c8e1e04a76506a4dfc852c3b3813deb0aef284548

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 07:34:48 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Sep 2019 04:18:24 GMT
Server
Microsoft-IIS/10.0
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Vary
Accept-Encoding
Content-Type
application/javascript; charset=utf-8
Cache-Control
public, max-age=74615
Connection
keep-alive
Content-Length
11933
Expires
Thu, 12 Sep 2019 04:18:24 GMT
ids.js
cdn.tynt.com/
10 KB
4 KB
Script
General
Full URL
https://cdn.tynt.com/ids.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.16.87.26 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
287208897e7a721606ca56270a90e1e8affb12efa108047980b6026436f2ddae

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 07:34:49 GMT
content-encoding
gzip
cf-cache-status
HIT
last-modified
Tue, 27 Aug 2019 20:41:53 GMT
server
cloudflare
age
211865
etag
W/"5d659591-26f8"
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=259200
cf-ray
5147f6206957974e-FRA
expires
Sat, 14 Sep 2019 07:34:49 GMT
sovrn
pd.sharethis.com/pd/ Frame E041
0
170 B
Script
General
Full URL
https://pd.sharethis.com/pd/sovrn
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
18.185.201.52 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-185-201-52.eu-central-1.compute.amazonaws.com
Software
/
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
Wed, 11 Sep 2019 07:34:49 GMT
Connection
keep-alive
X-Robots-Tag
noindex, nofollow
Content-Length
0
Content-Type
application/javascript
pixel
ps.eyeota.net/ Frame E041
0
141 B
Script
General
Full URL
https://ps.eyeota.net/pixel?pid=51md42u&t=ajs&uid=de2e0b8c7ff08336dcad6b3e
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
54.93.117.16 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-93-117-16.eu-central-1.compute.amazonaws.com
Software
/
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
Wed, 11 Sep 2019 07:34:49 GMT
Cache-control
private
Content-Length
0
merge
ce.lijit.com/ Frame E041
Redirect Chain
  • https://ce.lijit.com/merge?pid=5176&3pid=1
  • https://ce.lijit.com/merge?pid=5176&3pid=1&dnr=1
0
403 B
Image
General
Full URL
https://ce.lijit.com/merge?pid=5176&3pid=1&dnr=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
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
X-Powered-By
raptor
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
X-Sovrn-Pod
ap3ams1
Content-Type
text/html;charset=utf-8
X-Application-Context
application:prod:9080
Expires
Fri, 20 Mar 2009 00:00:00 GMT

Redirect headers

Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
X-Powered-By
raptor
P3P
CP="CUR ADM OUR NOR STA NID"
Location
https://ce.lijit.com/merge?pid=5176&3pid=1&dnr=1
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
X-Sovrn-Pod
ap3ams1
Content-Length
0
X-Application-Context
application:prod:9080
Expires
Fri, 20 Mar 2009 00:00:00 GMT
merge
ce.lijit.com/ Frame E041
Redirect Chain
  • https://bcp.crwdcntrl.net/5/c=5436/tp=SVRN/tpid=de2e0b8c7ff08336dcad6b3e/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id}
  • https://bcp.crwdcntrl.net/5/ct=y/c=5436/tp=SVRN/tpid=de2e0b8c7ff08336dcad6b3e/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id}
  • https://ce.lijit.com/merge?pid=5001&3pid=e20efdfb5b09d6b8ade69bf5622a7d51
0
403 B
Image
General
Full URL
https://ce.lijit.com/merge?pid=5001&3pid=e20efdfb5b09d6b8ade69bf5622a7d51
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
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
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
Wed, 11 Sep 2019 07:34:50 GMT
Server
nginx
X-Powered-By
raptor
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
X-Sovrn-Pod
ap3ams1
Content-Type
text/html;charset=utf-8
X-Application-Context
application:prod:9080
Expires
Fri, 20 Mar 2009 00:00:00 GMT

Redirect headers

Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:49 GMT
P3P
CP=NOI DSP COR NID PSAa PSDa OUR UNI COM NAV
Location
https://ce.lijit.com/merge?pid=5001&3pid=e20efdfb5b09d6b8ade69bf5622a7d51
Cache-Control
no-cache
X-Server
10.45.2.212
Connection
keep-alive
Content-Length
0
Expires
0
validateCookie
segments.company-target.com/ Frame E041
Redirect Chain
  • https://segments.company-target.com/log?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e
  • https://segments.company-target.com/validateCookie?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e&verifyHash=46ab6971e7da86cac29495c37bc34111e18876b2
26 B
390 B
Image
General
Full URL
https://segments.company-target.com/validateCookie?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e&verifyHash=46ab6971e7da86cac29495c37bc34111e18876b2
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
143.204.214.70 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-70.fra53.r.cloudfront.net
Software
/
Resource Hash
3b7b8a4b411ddf8db9bacc2f3aabf406f8e4c0c087829b336ca331c40adfdff1

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
Wed, 11 Sep 2019 07:34:49 GMT
Via
1.1 f8895de4463e8d120a0f4b4a1f7703e4.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA53-C1
Vary
Origin
X-Cache
Miss from cloudfront
Content-Type
image/gif
Connection
keep-alive
trace-id
90658cf9ce8a93de
Content-Length
26
X-Amz-Cf-Id
8_xP9qJGBLlfxiZdbuhWAj7_QF0kJHexMn7JFkOA_knKx44ptxk8ow==

Redirect headers

Date
Wed, 11 Sep 2019 07:34:49 GMT
Via
1.1 f8895de4463e8d120a0f4b4a1f7703e4.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA53-C1
Vary
Origin
X-Cache
Miss from cloudfront
Location
/validateCookie?vendor=sovrn&user_id=de2e0b8c7ff08336dcad6b3e&verifyHash=46ab6971e7da86cac29495c37bc34111e18876b2
Connection
keep-alive
trace-id
e6d200946fb74eeb
Content-Length
0
X-Amz-Cf-Id
WeyZtH_kVJKXBuvPZAKfTE0GD8wKjv35VUS7gqPPfvtgQXh_zDGhBA==
/
p.adsymptotic.com/d/px/ Frame E041
43 B
339 B
Image
General
Full URL
https://p.adsymptotic.com/d/px/?_pid=15697&_psign=0a885fb568701ac53478d88866a10345&_pu&_puuid=de2e0b8c7ff08336dcad6b3e&_redirect=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5014%263pid%3D${UUID}&_rand=1457107
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
104.18.102.194 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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 07:34:49 GMT
last-modified
Mon, 28 Sep 1970 06:00:00 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
content-type
image/gif
status
200
cf-ray
5147f6210dfb272a-FRA
content-length
43
collect
dx.bigsea.weborama.com/ Frame E041
Redirect Chain
  • https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=de2e0b8c7ff08336dcad6b3e
  • https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=de2e0b8c7ff08336dcad6b3e&bounced=1&rn=333754
  • https://rd.frontend.weborama.fr/rd?url=https%3A%2F%2Fdx.bigsea.weborama.com%2Fcollect%3Fdsp_id%3D0%26eid%3D%7BWEBO_ID%7D
  • https://dx.bigsea.weborama.com/collect?dsp_id=0&eid=ABt2rDP@fJAA
0
628 B
Image
General
Full URL
https://dx.bigsea.weborama.com/collect?dsp_id=0&eid=ABt2rDP@fJAA
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
52.31.41.246 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-41-246.eu-west-1.compute.amazonaws.com
Software
nginx /
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
Wed, 11 Sep 2019 07:34:50 GMT
Last-Modified
Wed, 11 Sep 2019 07:34:50 GMT
Server
nginx
P3P
CP="NOI DSP COR CURa DEVa PSAa OUR STP UNI DEM"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0
Connection
keep-alive
Expires
Tue, 03 Jul 2001 06:00:00 GMT

Redirect headers

pragma
no-cache
date
Wed, 11 Sep 2019 07:34:50 GMT
via
1.1 google
last-modified
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.12.0
status
302
location
https://dx.bigsea.weborama.com/collect?dsp_id=0&eid=ABt2rDP@fJAA
p3p
CP="NOI DSP COR CURa DEVa PSAa OUR STP UNI DEM"
access-control-allow-origin
*
cache-control
no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0
alt-svc
clear
content-length
0
expires
Tue, 03 Jul 2001 06:00:00 GMT
ct
ap.lijit.com/data/ Frame E041
43 B
207 B
Image
General
Full URL
https://ap.lijit.com/data/ct?tid=m_600632_36cd73dc80ec40c183e8ca529c2b3cf9&zoneid=600632&cid=18&geo=DE&all_tags=130%2C133%2C134%2C138%2C151%2C174%2C185%2C203%2C205%2C206%2C211%2C234%2C239%2C241%2C248%2C265%2C277%2C309%2C331%2C332%2C333%2C334%2C335%2C336%2C369%2C380%2C381%2C383%2C388%2C396%2C413%2C415%2C417%2C420%2C421%2C423%2C429%2C444%2C450%2C454%2C455%2C460%2C466%2C472&tss=344%2C345%2C350%2C351%2C353%2C354%2C356%2C357&fired_tags=138%2C151%2C234%2C265%2C309%2C369%2C388%2C421&count=8&status=8%2C8%2C8%2C1%2C1%2C8%2C12%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8&elapsed_ms=362
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
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / podlogging
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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 07:34:49 GMT
Server
nginx
X-Sovrn-Pod
ap3ams1
X-Powered-By
podlogging
Content-Length
43
Content-Type
image/gif
63ff9320-c4ad-4d4f-83ac-67defc2b6508
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/63ff9320-c4ad-4d4f-83ac-67defc2b6508?noc=54fci680&aid=182yo&cid=2oidc&cti=4c7pc&imp=7&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=1568187289
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 google
last-modified
Wed, 11 Sep 2019 07:34:49 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
getAd
video-adserver.ibillboard.com/ Frame 53DA
48 B
567 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=8f885e3cee&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=0c7847b4-8941-4e64-bf2f-6ccbc3da1cad
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.126 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
bbnaut2.bbelements.com
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
Wed, 11 Sep 2019 07:34:49 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
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 83D0
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=4754687769
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.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
Wed, 11 Sep 2019 07:34:50 GMT
Last-Modified
Wed, 11 Sep 2019 04:42:17 GMT
Server
AmazonS3
x-amz-request-id
C4822DB4F1983DD1
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
jcxoEoLCH+vxRlhl1GxEaOJRcnsYpzHtJl6FdW+g6tf+qyH79ysjJQiST2jdkYumRyO8U4H4Kwc=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 83D0
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=2846364753
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
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
Wed, 11 Sep 2019 07:34:49 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
Wed, 11 Sep 2019 07:49:49 GMT
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/201908291025/wrap.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
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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 c90147ea5199ff7ce77981c8da4247c4.cloudfront.net (CloudFront), 1.1 varnish
age
343034
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-hhn4044-HHN
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1568187290.761631,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
FRA53-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
7gUcLzi9Khb5x-2SymG6R2mlKzrS3XKJ2sLgDHJDdcYZJ_oPKcTwKw==
x-cache-hits
302985
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
707 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
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
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
408
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
grODyaFUyHwi27S6u2hd746yPHwUf+y1im5Wn93DxT7wozhn8KMFUP712WAAG3eD1t2rnF4k3Bs=
x-served-by
cache-hhn4044-HHN
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
S1568187290.761676,VS0,VE0
date
Wed, 11 Sep 2019 07:34:49 GMT
x-amz-request-id
29D722C296265892
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
63
x-cache-hits
950
truncated
/ Frame 03CB
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5afbbee8748df44c7e896542d90265ac65a7764070aa62948af2ed1819d9840f

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
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8J5YAAUkzFUCPJAAAAAAAABevQAPAAAFAAevQTmxfAPAAAAAAAAABmxfAZAAAOA55A55A85B55A58E55A55AFA24A13A0BErmxfAPNHA/EAAKAHUOaAPAAA1IASCAHtadAPAAAAAAAAAImxfAPBAANUASCAHkMnASksFAFjAAAAAAAAAAAAEAAAevQAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAxyAw4E2wAwBEMAxzA4yA41Ax0AxwA3zAGAkpFylFj0FAAAAIA0zA2yA5xA31AKA1xAz3Ax4Aw5A32ADAzrF5BFKA1xAz3Ax4Aw5A32AKA1xAz3Ax4Aw5A32AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdAAAAAAAAAAAAFAAAmxfAAAAAHAisFvjFrlFyBFAAAAAAAAAAAAAAAAQtjFppdxSA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8K6YAA/k0FWUmvFytFh0FjvFklF9iEsvFjrFlyFmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FtvEmtBwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FtvEmtBwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A5wA4zAmvFytFh0FjvFklF9XEhsFswFhwFlyFmhEk2F90Az2Ay5Ax3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AxzA3xA4wA53A2mAjpFk9BxzA4yA40A4xAx2A42AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BihFuuFlyFmhEwjF91AxzA3xA4wA53A2mAhwFk9B1xAz3Ax4Aw5A32AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5AwmEvyFthF0jFvkFl9BisFvjFrlFymBhkF29BxwA10A05Ax2A11AmjEwpFk9BklFzrF0vFwmBhwFh9B1wAwyAxwAw2Ax5AmjEpkF9xAz4Ay2A1wA13A2yA0mAzpF6lF94AwwA40B1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BwvFz0FlyFhkFmhEwjF91AwwAyxAwwA2xA5mAhwFk9B1wAwyAxwAw2Ax5AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGwFvzF0lFyhFkmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45Ax5A3mEvyFthF0jFvkFl9BisFvjFrlFymBhkF29B0zA2yA5xA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xAz3Ax4Aw5A32AmjEpkF9xAz4Ay4A1xA0xAw3AzmAzpF6lF9xAywA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xAz3Ax4Aw5A32AmhEwkF91AxzA3xA4wA53A2mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A24Ax4A3yA45AywA3mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29BxzAxxA12A4xA1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwA14A34A0xA4mAjpFk9BxzA4yA21AwwAz2AyzAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9yEljF0hFunFslFmhEwjF91AwwA14A34A0xA4mAhwFk9B1wAw1A43A40Ax4AmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A4xA43Ay4A52A43ATkzFARksFAQtjFO0ONcA
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.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:49 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:48 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 83D0
650 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=7598288660
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.60 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-60.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f

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
Wed, 11 Sep 2019 07:34:48 GMT
Via
1.1 0cbb1ca51bf146be48b40804581e4466.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
36
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
650
Last-Modified
Thu, 22 Aug 2019 19:35:49 GMT
Server
AmazonS3
ETag
"5fc4deddff2532151bd956c4931604f7"
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
FRA53-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
9J_V_LuJSXEgGvYEglmT2BcIgYpxA3QlC06xhehJMWk_YmEHla0reg==
Expires
0
Cookie set map
ih.adscale.de/ Frame C77A
Redirect Chain
  • https://ih.adscale.de/map?format=display&ssl=1
  • https://ih.adscale.de/map?format=display&ssl=1&nut&uu=2f68e771da764dbaa5621824bc8c2f32
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1&nut&uu=2f68e771da764dbaa5621824bc8c2f32
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=2f68e771da764dbaa5621824bc8c2f32
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
Wed, 11 Sep 2019 07:34:49 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:49 GMT
Content-Length
675
Connection
keep-alive
Set-Cookie
tu=4#2850625469#48~~435607~435607~1#101~~435607~435607~1#38~~435607~435607~1#39~~435607~435607~1#40~~435607~435607~1#42~~435607~435607~1#75~~435607~435607~1#63~~435607~435607~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None

Redirect headers

Server
Apache-Coyote/1.1
Location
https://ih.adscale.de/map?format=display&ssl=1&nut&uu=2f68e771da764dbaa5621824bc8c2f32
Content-Length
0
Expires
Wed, 11 Sep 2019 07:34:49 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:49 GMT
Connection
keep-alive
Set-Cookie
uu=2f68e771da764dbaa5621824bc8c2f32; Domain=.adscale.de; Expires=Tue, 08-Sep-2020 00:01:29 GMT; Path=/
nuggad
ih.adscale.de/ Frame A62C
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%2F362bbab8f...
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/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
Wed, 11 Sep 2019 07:34:50 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
Wed, 11 Sep 2019 07:34:50 GMT

Redirect headers

Date
Wed, 11 Sep 2019 07:34:49 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/362bbab8f6944c9894a0c3daf66ec9c1/ts/1568187289374/v/2/hid/406/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
/
ssl.1.damoh.giga.de/642368ed1fe772773708c70d99e101f02e0e0cda/ Frame 83D0
650 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.giga.de/642368ed1fe772773708c70d99e101f02e0e0cda/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
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
AmazonS3 /
Resource Hash
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f

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
Wed, 11 Sep 2019 07:34:49 GMT
Connection
keep-alive
Content-Length
650
Last-Modified
Thu, 22 Aug 2019 19:35:49 GMT
Server
AmazonS3
Etag
"5fc4deddff2532151bd956c4931604f7"
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
de34-homad-1
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
p
ic.tynt.com/b/
0
294 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&cu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
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
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.14.0
p3p
policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID", CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
st
imprammp.taboola.com/ Frame A109
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=888CF1732517504431055646127&cicmp=1657475&cijs=1&dast=V7fIQCFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosthsdpPhYjVaTSHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDAIqD4Vx368tudLg-L7s_AAAeAkAAAAYUSAAGcJpKACpyDk4AAAAAAAAAAFj-____YwD0iM9kADKUBm8MegAefAAehAAAALKGaJGuMQevfh6ICg6LGAEAAABAMrV5HE3qhMqiCgCAIN0K4AoAIKDt48dhOEt3UOItDAAAgGBsgR4Wv9_ssGv8bpcBAAAAAAAAAJj9n_2jCRGNuaUFsRTwqv0CAgCs_QICALCpGwDAWwBc0AXA6gxishntJrMDAAAAuPv____XA4nFzLjybSwe02Bh2UwcnpXJZdlMVrPJYrCZLUbbGyofot7cNYLpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhBHbZuIxLnxryWphcouWG99aONrM1jKLbWUczVaDwcS5Fr0-ptNuMlkuhlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8ZiZlz5NhaPabCwbCYOz8rksmwmq9lkMdjMFqN9xbaZeIwL31qyWpjcouXGtxaONrO1zGJbGUez1WAwca5Fr4_ptJtMlovhvrGaDRfD3WQ43DdWs-FiuJsMh_sOneG7-pyNyptW4dEp036hbilzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTpReVYji28xWC5nK4fJZZpMZqbNbLRZWXYTi2s3s4glStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HAY!&excid=22&tst=1&docw=0
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
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

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=888CF1732517504431055646127&cicmp=1657475&cijs=1&dast=V7fIQCFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosthsdpPhYjVaTSHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDAIqD4Vx368tudLg-L7s_AAAeAkAAAAYUSAAGcJpKACpyDk4AAAAAAAAAAFj-____YwD0iM9kADKUBm8MegAefAAehAAAALKGaJGuMQevfh6ICg6LGAEAAABAMrV5HE3qhMqiCgCAIN0K4AoAIKDt48dhOEt3UOItDAAAgGBsgR4Wv9_ssGv8bpcBAAAAAAAAAJj9n_2jCRGNuaUFsRTwqv0CAgCs_QICALCpGwDAWwBc0AXA6gxishntJrMDAAAAuPv____XA4nFzLjybSwe02Bh2UwcnpXJZdlMVrPJYrCZLUbbGyofot7cNYLpGxGW2e87KCinp8fsMshYLpNBLZA1TS6_QXzQMCwng2B-E7YYrSaTzXI4Wy4mg-FoOBrtT-BGA5yg4XCw2A0Wu8ViOFlMRoPlYIECMZjghAxHm8lqtFvtJsvhZDSabSYbpGjVajbaDIar2WS2262Gg-FyNEKK1ixmk8liNlruNoPlZDQYToZDhBHbZuIxLnxryWphcouWG99aONrM1jKLbWUczVaDwcS5Fr0-ptNuMlkuhlsUDFDai-AinWhOl7_LZXlr3ha3zulzWMQSzckincgu-8ZiZlz5NhaPabCwbCYOz8rksmwmq9lkMdjMFqN9xbaZeIwL31qyWpjcouXGtxaONrO1zGJbGUez1WAwca5Fr4_ptJtMlovhvrGaDRfD3WQ43DdWs-FiuJsMh_sOneG7-pyNyptW4dEp036hbilzGhQug8X7k5gW0-7s4Pn9jk6V6qIxNmTfhMJs8BgMilgiOF2kE9HLeLqIJZKnRTpReVYji28xWC5nK4fJZZpMZqbNbLRZWXYTi2s3s4glStNFOtHrXhaH4fD5Cx7Ow8PsFz0Nh89f8HAeHma32O9z2t2av1vnMpo-b9Xd5Nb83WK_y3N6K42Wt9jvc9rdgsvfYna5XRb1HxtiNJrrZnPFYDnXDFYJAAAAAAAAAGAJc-ZNAAAAAE4DWSwGk8VyASDEWHcJPqVCHp3A34obP4aY0-XvclnemrfFrXP6HAY!&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=b63bc8a7-25ad-49c7-8436-fb6e846500b9-tuct4722918
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
Wed, 11 Sep 2019 07:34:49 GMT
via
1.1 varnish
x-served-by
cache-hhn4080-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1568187290.864938,VS0,VE9
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/23_11_1/infra/
749 KB
177 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_11_1/infra/cmTagFEED_MANAGER.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.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
AmazonS3 /
Resource Hash
3129f79d675b722127fb444575457ed12ff5341b4309541e5b4c5e14fc421135

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 07:34:49 GMT
via
1.1 e89c67951b2bc58773e3664c08702f34.cloudfront.net (CloudFront), 1.1 varnish
age
515622
x-amz-meta-mtime
1567671471
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1567671504
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
180425
x-served-by
cache-hhn4044-HHN
last-modified
Thu, 05 Sep 2019 08:18:26 GMT
server
AmazonS3
x-timer
S1568187290.798397,VS0,VE0
etag
"fdfbc12584745254ede36de885096db5"
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
ftQUOoLWKHIZmb3c3RFGYxWF_55Pr4Xvva0AaJ9nqYRVmRgU2FKV5w==
x-cache-hits
168640
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_11_1/assets/css/
34 KB
7 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/23_11_1/assets/css/cmOsUnit.css
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.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
AmazonS3 /
Resource Hash
d414d33904b7f1f70da24215298772bbe90ded3c70d5a9f96ec8eeac147181cb

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 07:34:49 GMT
via
1.1 96c175ce63da79b249fc4597809077cc.cloudfront.net (CloudFront), 1.1 varnish
age
515624
x-amz-meta-mtime
1567671469
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1567671482
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
6203
x-served-by
cache-hhn4044-HHN
last-modified
Thu, 05 Sep 2019 08:18:04 GMT
server
AmazonS3
x-timer
S1568187290.798406,VS0,VE0
etag
"70512ef817c4d36415176901f3ccd7ac"
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
text/css
x-amz-cf-id
PjVMTQBX8crzYADpRniQTPFTNu0uCcU7w5A5YxJYc_NBBisj01gWTw==
x-cache-hits
248766
xiw
tracker-adserver.ibillboard.com/error/impid/0c7847b4-8941-4e64-bf2f-6ccbc3da1cad/iid/225bf526-cc90-41db-a82d-1ae9b6021395/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2... Frame 53DA
0
272 B
Image
General
Full URL
https://tracker-adserver.ibillboard.com/error/impid/0c7847b4-8941-4e64-bf2f-6ccbc3da1cad/iid/225bf526-cc90-41db-a82d-1ae9b6021395/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/xiw?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.126 Velke Prilepy, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
bbnaut2.bbelements.com
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
Wed, 11 Sep 2019 07:34:49 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 53DA
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.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
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
Wed, 11 Sep 2019 07:34:49 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
Wed, 11 Sep 2019 08:34:49 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/201908291025/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
/
Resource Hash
9577813fe87cfe961576762bfb2d22a20545fa7611d71e9788283bc6bc72f6b0

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 07:34:49 GMT
content-encoding
gzip
last-modified
Tue, 10 Sep 2019 14:48:57 GMT
x-amz-request-id
41BB2794E1AB0EBB
etag
"63b4fd36abe19ce1dba43bee65254c55"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
1
accept-ranges
bytes
content-length
189683
x-amz-id-2
UdQjjJ4iRsYEy6DEHu3H3gKskB65a69vkSMJeHWU2T+kIhIm7ng2u7v/spAkDgVOr0mX0ac4wyI=
expires
Wed, 11 Sep 2019 07:44:49 GMT
hic_qos
ssl.1.damoh.giga.de/ Frame 83D0
24 B
356 B
Script
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,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
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.1 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

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
Wed, 11 Sep 2019 07:34:50 GMT
Last-Modified
Wed, 24 Jul 2019 10:17:21 GMT
Server
openresty/1.15.8.1
ETag
"5d383031-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame FF6E
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
447c87839e7f642d1141287acb1e5811eb9ed03e6671f4e092e7752d20173a2c

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
/
ssl.1.damoh.giga.de/15538f53e6e1c3f5d790afa0c1cd2c2fd9388c0c/ Frame 83D0
109 B
671 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/15538f53e6e1c3f5d790afa0c1cd2c2fd9388c0c/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
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
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
Wed, 11 Sep 2019 07:34:50 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.1.damoh.giga.de/a38e51f61fb7e0f07b113ff7d888037a9bb4caef/ Frame 83D0
42 B
875 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/a38e51f61fb7e0f07b113ff7d888037a9bb4caef/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGlld2FKYWhmYWlwaGFoSm89aWV3YUphaGZhaXBoYWhKb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3guUWV8fCh4LlFlPTApO3guUWUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5RZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5XYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5vbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkphPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuZWYoYyk7YS5EdChsKTthLkN0KG0pO2Euc3QoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkZiLmxlbmd0aCl7dmFyIGE9bC5GYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5KdCh7IltMT0FEU0NSSVBUXSI6ZS5iYSgxMCksIltVVElMU10iOmUuYmEoMTApLCJbQ0FMTEJBQ0tdIjplLmJhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5laC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZWgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXA9dGhpcy5hWzFdO3RoaXMuRm49dGhpcy5hWzJdO3RoaXMubGw9dGhpcy5hWzZdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMudG09dGhpcy5hWzRdO3RoaXMuWW49dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbM119Yy5Waz1iO2IucHJvdG90eXBlPXtocDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXA6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZuOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sbDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWw6dGhpcy5zbShhKX0sc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy50bTp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWW46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYT1jLlZrfHxpYSxsYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1sYy5ocCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vbz0hMTt0aGlzLlJhPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYXQuYmluZCh0aGlzKSk7dGhpcy5pYj17fTt0aGlzLk1nPXt9O3RoaXMuYmY9ITF9Yy5Qaj1iO2IucHJvdG90eXBlPXtjdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5pYil0aGlzLmliLmhhc093blByb3BlcnR5KGIpJiYoYSs9YisKdGhpcy5pYltiXSsiXyIpO3JldHVybiBhfSx5YzpmdW5jdGlvbigpe3RoaXMuYmZ8fCh0aGlzLmJmPWUuYmEoMTApKTtyZXR1cm4gdGhpcy5iZn0samI6ZnVuY3Rpb24oYSl7dGhpcy5pYlthXXx8KHRoaXMuaWJbYV09MCk7dGhpcy5pYlthXSs9MTs1PHRoaXMuaWJbYV0mJiF0aGlzLk1nW2FdJiYodGhpcy5NZ1thXT0hMCwibmV3QmlnQWRJZCI9PWEmJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLmN1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmFhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbm46ZnVuY3Rpb24oYSl7dGhpcy5hYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYKKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG1hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxhdDpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy4kcyhhLmRhdGEpfSwkczpmdW5jdGlvbihhKXtpZih0aGlzLmFhJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYWEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYWEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5hYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LAprZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlxKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5kaChhLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmJ9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0saXE6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sbG46ZnVuY3Rpb24oYSwKYil7aWYoYiYmISgwPnRoaXMubGEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yil7aWYoZS5TcChhKSlyZXR1cm47KGI9dGhpcy5rZyhhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMuYWEudXJsc1thXT1iO3RoaXMuYWEudXJsc1tiXT1hO3RoaXMuYWEuaG9tYWRVcmxzW2FdPWI7dGhpcy5hYS5vcmlnaW5hbFVybHNbYl09YX19LFNwOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmFhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHNnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYWEub3JpZ2luYWxVcmxzJiZ0aGlzLmFhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5hYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxhYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxzZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEJnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxHaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxBZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLG49MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7bj1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxuJiYoYz0xMDAvbipkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5BZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZShhKX0uYmluZCh0aGlzKSwxMDApfSwKRGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYmE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxoKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLG4sYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsTD0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLHAsbSx0LEIscjthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBxPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCluPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHEucHVzaChuKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnwKYS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKHA+Pj4yOSk7cS5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHEubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7bj1lO3A9ZzttPWs7dD1MO0I9bDtmb3IoZj0wOzE5Pj1mO2YrKylyPWQobiw1KSsocCZtfH5wJnQpK0IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsQj10LHQ9bSxtPWQocCwzMCkscD1uLG49cjtmb3IoZj0yMDszOT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChuLDUpKyhwJm18cCZ0fG0mdCkrQitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxCPXQsdD1tLAptPWQocCwzMCkscD1uLG49cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKG4sNSkrKHBebV50KStCK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LEI9dCx0PW0sbT1kKHAsMzApLHA9bixuPXI7ZT1lK24mNDI5NDk2NzI5NTtnPWcrcCY0Mjk0OTY3Mjk1O2s9ayttJjQyOTQ5NjcyOTU7TD1MK3QmNDI5NDk2NzI5NTtsPWwrQiY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKEwpK2IobCkpLnRvTG93ZXJDYXNlKCl9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsbixjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLG49YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxuPj42LGc9biY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4obikmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxkcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LHRjOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsbj0hMSxjPSExLGU9ITEsZz0hMSxrPSExLG09ITEsbD0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKHApe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTmI/ITA6ITF9Y2F0Y2godCl7fXRyeXtuPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWEsbD0obXx8bikmJiEhd2luZG93LkNTU31jYXRjaChxKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9bjthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9Cmw7cmV0dXJuIGF9LGNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy50YygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LGtiOmZ1bmN0aW9uKCl7dmFyIGE9e01pOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LFhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LEtxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHJsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApLbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sZW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5NaSgpfHxhLlhpKCl8fGEuS3EoKXx8YS5ybCgpfHxhLkttKCl9fTtyZXR1cm4gYS5lbygpfSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLG49YS5sZW5ndGg7ZjxuOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LFNiOmZ1bmN0aW9uKGEpe2E9dGhpcy5sYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMubGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxQbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLG49MDtuPGIubGVuZ3RoO24rKylkW2Jbbl1dPSEwO2ZvcihuPTA7bjxhLmxlbmd0aDtuKyspZFthW25dXXx8Zi5wdXNoKGFbbl0pO3JldHVybiBmfSxYdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKwo2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx4ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuVWgoYikrIjoiK3RoaXMuVWgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFVoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxkZjpmdW5jdGlvbihhKXt0aGlzLlJhPWF9LHVnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuUmE7dGhpcy5WZihkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sCnZjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy51ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZyl7dmFyIEE9YTtkJiZiJiYoYj1rLlZhKGIsZCkpO2ImJihBPWsuVmEoYSxiKSk7ZiYmKEE9ay5WYShBLGYpKTtuJiYoQT1rLlZhKEEsbikpO2MmJihBPWsuVmEoQSxjKSk7ZyYmKEE9ay5WYShBLGMpKTtlLnZjKEEpfSxjdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9CmEuY29kZTtiLnNpdGVfaHJlZj10aGlzLnNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdChhKTtpZihiKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC5EZCgpO2wueWEoYSwKITApO2E9bC55YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5YKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pO3RoaXMuTWNbZl18fCh0aGlzLk1jW2ZdPTApO3RoaXMuTWNbZl0rKzsxMDx0aGlzLk1jW2ZdfHwoZj1sLkRkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnlhKGYsITApLGY9bC55YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIiwKZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxJZTpmdW5jdGlvbigpe2wmJmwuWD9sLmlzRW5hYmxlZCYmbC51bygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZSgpfS5iaW5kKHRoaXMpLDUwMCl9LHFlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuZ2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxnYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sWmY6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLkRlKGEpfHx0aGlzLmdyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmd2luZG93LnNhbmRib3guYWYmJndpbmRvdy5zYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guYWZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnNnKGEpKXJldHVybiB0aGlzLnNnKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O24uaG9tYWRfdXJsX3N1ZmZpeD1hO24uaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtuLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7bi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKG5bIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKG4uaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7bi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjtuLmhvbWFkX3ZwYWlkX2N0eD0idHJ1ZSI7ZiYmZi5vbmx5VVJMJiYobi5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFGaWxlIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuV2EoYSxiLklhLG4sZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sCmZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5sbihjLGEpO3JldHVybiBjfSxXYTpmdW5jdGlvbihhLGIsZCxmLG4sYyxlLGcpe3ZhciBrPWN8fGw7Yz0hMDtnJiYoYz0hMSk7aWYoayYmay5YKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7bihtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpbigpO2Vsc2V7ay55YShhLGMpO2M9ay55YShhLGMpO2MuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7Yy5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpYy5kYXRhW3JdPWRbcl07cmV0dXJuIGsuS2EoYyxmLG4sIiIsIiIsZSl9fWVsc2UgbigpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldhKGEsYixkLGYsbiwKayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LGRoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LERyOmZ1bmN0aW9uKGEsCmIsZCl7dGhpcy5kaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5LYylmb3IodmFyIGMgaW4gdGhpcy5LYylhPWEuc3BsaXQoYykuam9pbih0aGlzLktjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS51YihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGVoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy51YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLldhKGEsZi5JYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuRHIoZi51ZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sSnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2M9YX0sQXY6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLldhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLApkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGUpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LGZvOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxicjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPQowO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBSPWMuUGp8fFI7bmV3IFI7dmFyIGU9bmV3IFI7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuT2o9YjtiLlZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5Vcz17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Wcj17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5wdj17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkhwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudnY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuTWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLlFmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLlVmPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5kbj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld1PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuVXI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuSXA9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnV2PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmhnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuSm89e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuZmQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5TZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuZm49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlVjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5YZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5aZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IuZW49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmFpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuWnI9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07CmIueGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2Iuc2Y9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmlnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5udj17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UdT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLldyPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz0KYy5Panx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YcD10aGlzLmFbMV07dGhpcy5ncD10aGlzLmFbMV07dGhpcy54dD10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMV07dGhpcy5aaj10aGlzLmFbOF07dGhpcy5Xbj10aGlzLmFbOF07dGhpcy53bj10aGlzLmFbMV07dGhpcy53az10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsxMF19Yy5RbD1iO2IucHJvdG90eXBlPXtXcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWHA6dGhpcy5mcChhKX0sZnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdwOnRoaXMud3QoYSl9LHd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54dDp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQWw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOgp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV246dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnduOnRoaXMudmsoYSl9LHZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53azp0aGlzLnN2KGEpfSxzdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudHY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2E9Yy5RbHx8a2EsbWM9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bWMuV3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Raj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLApiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpfSxtcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD0KYSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLm9kKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMub2QoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxpYTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVlKHRoaXMuamEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sU2c6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLm1xKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLApiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLm9kKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgSj1jLlFqfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNsPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs2XTt0aGlzLiRvPXRoaXMuYVs0XTt0aGlzLlpwPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzFdfWMuS3U9YjtiLnByb3RvdHlwZT17Ymw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbDp0aGlzLlpvKGEpfSxabzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuJG86dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTsKdmFyIGxhPWMuS3V8fGxhLG5jPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW5jLmJsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGgpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGhbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoaFtjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaD10aGlzLm07dGhpcy5tPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tPWg7cmV0dXJuIGZ9fShjLGhbY10pOmhbY107aD0iZnVuY3Rpb24iPT09dHlwZW9mIGYubD8KZi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5kaj1ifSkoYyk7dmFyIE09Yy5kanx8TTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaT10aGlzLmFbMl07dGhpcy5Faj10aGlzLmFbOF07dGhpcy50aj10aGlzLmFbOF07dGhpcy5QdT10aGlzLmFbOV07dGhpcy5QdD10aGlzLmFbMTBdO3RoaXMuT3M9dGhpcy5hWzFdO3RoaXMuTXE9dGhpcy5hWzddO3RoaXMueXI9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbOF19Yy5Hbj1iO2IucHJvdG90eXBlPXtZaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWmk6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkVqOgp0aGlzLnNqKGEpfSxzajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudGo6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlB1OnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuT3M6dGhpcy5McShhKX0sTHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1xOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIG1hPWMuR258fG1hLG9jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPW9jLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuS2w9TS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5MYT0Ke307dGhpcy5LPW51bGw7dGhpcy5GYz0xMDA7dGhpcy5FYj0wO3RoaXMuU2E9MTUwO3RoaXMuSGI9MDt0aGlzLkV0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5FYjw9dGhpcy5TYT8odGhpcy5FYisrLHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpOjA+dGhpcy5TYSYmKHRoaXMuSGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5GYykpfSx1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkViPnRoaXMuU2E/ITA6ITF9LCRlOmZ1bmN0aW9uKCl7dGhpcy5FYj0wfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sRXQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sUDpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLGIuTygpLCEwKTt0aGlzLkxhW2IuamEoKV09YjtOJiZOLiRnJiZOLmJ1KGIpfSxjdzpmdW5jdGlvbigpe3JldHVybiBlLnNlKHRoaXMuTGEpfSwKTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5MYSlpZihhPT10aGlzLkxhW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkxhW2IuamEoKV0/ITA6ITF9LGNyOmZ1bmN0aW9uKGIpe2I9Yi5IYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkxhKWlmKGIuaWQ9PXRoaXMuTGFbYV0uSGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sc3c6ZnVuY3Rpb24oYil7dGhpcy5MYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHE9Yy5LbHx8cTsoZnVuY3Rpb24oYyl7Yy5NbD1NLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLkZjPTEwO3RoaXMuRWI9MDt0aGlzLlNhPTUwO3RoaXMuVj1udWxsO3RoaXMucWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLnliPSIiO3RoaXMubWc9ITE7dGhpcy5TKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLApoPXRoaXMuSGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sTWE6ZnVuY3Rpb24oKXt9LE10OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxkdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LEh0OmZ1bmN0aW9uKGIpe3RoaXMuTGU9Yn0sYnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MZX0sS2U6ZnVuY3Rpb24oKXt9LFI6ZnVuY3Rpb24oKXt0aGlzLkViPD10aGlzLlNhJiYodGhpcy5FYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUy5iaW5kKHRoaXMpLHRoaXMuRmMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LEFnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEZkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sdXc6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuRXEoKXx8dGhpcy5nbigpO3RoaXMuRmQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKZXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZ246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYmEoMTApKX0sRXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0semU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxUYTpmdW5jdGlvbigpe3JldHVybiExfSxudzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxGZTpmdW5jdGlvbigpe3JldHVybiExfSxCaDpmdW5jdGlvbihiKXt0aGlzLnliPWJ9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWJ9LHhoOmZ1bmN0aW9uKCl7dGhpcy55Yj1udWxsfSxndzpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMueWImJihiPSEwKTtyZXR1cm4gYn0scHc6ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5tZz0hMCl9LHBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFl2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHU9Yy5NbHx8dTsoZnVuY3Rpb24oYyl7Yy5raT1NLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLklmPSIxIjt0aGlzLkpmPSIyIjt0aGlzLlltPSIzIjt0aGlzLlBjPTA7dGhpcy5oaD0zMDt0aGlzLkxiPVtdO3RoaXMuYmI9W107dGhpcy5oYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5XZj10aGlzLlhoPSExO3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pZD1lLmJhKDEwKTt0aGlzLmVmKGIpO3RoaXMuRnQoYSl9LGc6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dGhpcy5YaHx8KHRoaXMuWGg9ITAsZS5JZSgpKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLk8oKTtTJiZTLlViJiYhbmEmJihuYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9ZS55YygpKTt3aW5kb3dbYS5pYSgpXVtiLmphKCldW2UueWMoKV0/d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldKys6d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLnljKCldPTF9LCRxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guaWEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0mJndpbmRvd1toLmlhKCldW2IuamEoKV0uaW5pdGlhdG9yIT1lLnljKCkmJih0aGlzLmZmKCksYT0hMSk7cmV0dXJuIGF9LEk6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMudGEoKSl7dGhpcy5XcSgpOwppZighdGhpcy4kcSgpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5mZigpO3JldHVybn10aGlzLmZmKCk7dGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5RaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sbzpmdW5jdGlvbihiLGEpe3RoaXMudGEoKXx8KHRoaXMuTGIucHVzaChiKSx0aGlzLmJiLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxRaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuTGImJjA8dGhpcy5MYi5sZW5ndGgmJih0aGlzLkxiPWUudW5pcXVlKHRoaXMuTGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkxiLmpvaW4oIiwiKSkpO2lmKHRoaXMuYmIpe2Zvcih2YXIgaD0wO2g8dGhpcy5iYi5sZW5ndGg7aCsrKXRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPT10aGlzLmhjW2JdJiZhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLHRoaXMuaGNbdGhpcy5iYltoXS5yZWFzb25dPAp0aGlzLmhjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5iYltoXS5kZXRhaWwpLGI9dGhpcy5iYltoXS5yZWFzb24pO3RoaXMuaGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxmdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLldmfSx3OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0sZmY6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkpmfSxLdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWW19LHJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5QY30sTmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuSWZ9LFB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkpmfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5QY30sZWY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRnQ6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS30sR3I6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLmtpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlsPXRoaXMuYVs2XTt0aGlzLk5vPXRoaXMuYVsxMF07dGhpcy5hbD10aGlzLmFbM107dGhpcy5wcj10aGlzLmFbNV07dGhpcy5Ndj10aGlzLmFbNF07dGhpcy5jaj10aGlzLmFbN107dGhpcy5Qcj10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLllsPWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWw6dGhpcy5NbyhhKX0sTW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5vOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuYWw6dGhpcy5vcihhKX0sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnByOnRoaXMuTHYoYSl9LEx2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ndjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2o6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Qcjp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBvYT1jLllsfHxvYSxwYz1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1wYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy54aj11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgcGE9Yy54anx8cGE7KGZ1bmN0aW9uKGMpe2MueWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLlF2O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmCihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5zYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLm8oImZyYW1ld29yayIpLHRoaXMucygpKX0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuSSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHFhPWMueWp8fHFhOyhmdW5jdGlvbihjKXtjLnpqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgcGEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlAoYiksKG5ldyBxYShiLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgcmE9Yy56anx8cmE7KG5ldyByYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1qPXRoaXMuYVs2XTt0aGlzLnNyPXRoaXMuYVs5XTt0aGlzLldtPXRoaXMuYVs2XTt0aGlzLmJwPXRoaXMuYVsxMF07dGhpcy53cj10aGlzLmFbN107dGhpcy5ZdT10aGlzLmFbNV07dGhpcy5tcz10aGlzLmFbMV07dGhpcy5odT10aGlzLmFbN107dGhpcy5Vbj10aGlzLmFbNl07CnRoaXMubHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5RbT1iO2IucHJvdG90eXBlPXtMajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTWo6dGhpcy5ycihhKX0scnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnNyOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XbTp0aGlzLmFwKGEpfSxhcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnA6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy53cjp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXU6dGhpcy5scyhhKX0sbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1zOnRoaXMuZ3UoYSl9LGd1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odTp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVW46dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxyOgp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHNhPWMuUW18fHNhLHFjPW5ldyBzYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXFjLkxqKDQpOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dGhpcy5yZygpO3RoaXMudGcoKTt0aGlzLklvPSExfSxyZzpmdW5jdGlvbigpe3RoaXMuVmI9ITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLlZiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlkoYil9LHRnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVmIpe3ZhciBiPXRoaXMuSGEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwodGhpcy5WYj0hMCk7dGhpcy5aKGEpfX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihtLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLlYmJigwLHRoaXMuVikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi0KYS5wb3NpdGlvbiYmdGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcykpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLkhkKGEpfS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5IZChhKX0uYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMucGxheWVyO2EuZ2V0UG9zaXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5MZSYmKDAsdGhpcy5MZSkoKX0sCnBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCl8fHRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxUYTpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSx1YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxwZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciB0YT1jLnRrfHx0YTsoZnVuY3Rpb24oYyl7Yy5zaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxTOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExfSxnOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5SYz0hMTt0aGlzLllkPTE7dGhpcy5TYz1bXTt0aGlzLnNiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5ZZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuc2I9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnNiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnNiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5zYj0hMCkpOnRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDb21wbGV0ZSIpO3RoaXMuUmM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZEltcHJlc3Npb24iKTt0aGlzLk9lKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5oaCYmIXRoaXMudGEoKSYmKHRoaXMuc2I/KHRoaXMubygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMucygpKToodGhpcy5vKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy50YSgpJiYodGhpcy5yYSgpLHRoaXMuZ2V0UGxheWVyKCkuSW89ITAsbS5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLnliO2EmJihhLnpkKCksYS5oZCgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMudygib25BZENvbXBsZXRlIik7dGhpcy5SYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLmhoJiYhdGhpcy50YSgpJiYodGhpcy5zYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMuU2MuaW5kZXhPZihhKSYmdGhpcy5TYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLncoKSx0aGlzLnNhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMudygiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubygiYWRlcnJvciIsYi5jb2RlKSx0aGlzLlNjLmxlbmd0aD49dGhpcy5ZZCYmdGhpcy5zKCkpfSxHcjpmdW5jdGlvbihiKXt0aGlzLm0oIkpXOiAiK2IudHlwZSl9LHM6ZnVuY3Rpb24oYil7Yj90aGlzLm1lP3RoaXMubWUrKzp0aGlzLm1lPTE6dGhpcy5sZT90aGlzLmxlKys6dGhpcy5sZT0xO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7ZS5HaChhLnZpZGVvVGFnKT9hLlZiP3RoaXMudygicGxheWVyIGlzIGludmFsZCIpOnRoaXMuUmN8fHRoaXMuaXNQbGF5aW5nPyh0aGlzLmxlPnRoaXMubWUmJihiPSExKSx0aGlzLkkoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5yZygpLGEudGcoKSxhLlZifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMjApKX19KX0pKGMpO3ZhciB1YT1jLnNrfHx1YTsoZnVuY3Rpb24oYyl7Yy51az1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmdxKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxoJiZoKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoaD0wO2g8YS5sZW5ndGg7aCsrKWIucHVzaChhW2hdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7andwbGF5ZXIoKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgdGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLk4oaCl8fHRoaXMuY3IoaCl8fCh0aGlzLlAoaCksaD1uZXcgdWEoaCx0aGlzLkspLGguUygpLGguZygpKX19dGhpcy5SKCl9fSwkdjpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxncTpmdW5jdGlvbigpe3ZhciBiPWUubGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUudWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHZhPWMudWt8fHZhLHdhPW5ldyB2YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm49dGhpcy5hWzldO3RoaXMub3A9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzddO3RoaXMuSW49dGhpcy5hWzRdO3RoaXMuanI9dGhpcy5hWzJdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLlJwPXRoaXMuYVs2XTt0aGlzLklrPXRoaXMuYVs4XTt0aGlzLkdxPXRoaXMuYVs2XTt0aGlzLmtzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzZdfWMuVnM9YjtiLnByb3RvdHlwZT17QW46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcDp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5IbihhKX0sSG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkluOnRoaXMuaXIoYSl9LGlyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcjp0aGlzLnlzKGEpfSx5czpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnpzOnRoaXMuUXAoYSl9LFFwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnA6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklrOnRoaXMuRnEoYSl9LEZxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5HcTp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB4YT1jLlZzfHx4YSxyYz1uZXcgeGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Bbig0KTsoZnVuY3Rpb24oYyl7Yy55bT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7CmE/KHRoaXMuWShhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMucGEoKSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuTGQoYil9LmJpbmQodGhpcykpfSxMZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5WJiZ0aGlzLlYoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFRhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGgpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB5YT1jLnltfHx5YTsoZnVuY3Rpb24oYyl7Yy54bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPXRoaXMuQWM9dGhpcy56YT10aGlzLlljPSExO3RoaXMudWg9ZS5EYigxMCk7dGhpcy5XaD0hMDt0aGlzLm1jPXRoaXMuUGc9ITE7dGhpcy5UcihiLmdldFJhd1BsYXllcigpKXx8KHRoaXMua2goKSx0aGlzLnJvKCksdGhpcy5uYigpKX0sVHI6ZnVuY3Rpb24oYil7cmV0dXJuIGUuQWEoInQtb25saW5lLmRlIik/ITE9PT1iLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0scXc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmphKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLAoiOyIsYi5XLCI7Iix0eXBlb2YgYi5XLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlc/Yi5XLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5XP3R5cGVvZiBiLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuSj9iLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hPwpiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5GYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRmE/Yi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5GYT90eXBlb2YgYi5pbWEuRmEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5KJiZiLkouRmE/Yi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IixiLkomJmIuSi5GYT90eXBlb2YgYi5KLkZhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLlZkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlZkOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVmQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5WZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLldkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouV2Q6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5XZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5KP2IuSi5uYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLm5hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLAoiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy51aCl9LHZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSwKUmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy52YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpe3ZhciBiPXRoaXMudmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5BYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuQWM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5BY30sYXI6ZnVuY3Rpb24oKXtpZighdGhpcy5PZyl7dmFyIGI9dGhpcy52YigpLGE9dGhpcy5acSgpO3dpbmRvdy5pbWEmJmImJgooYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLk9nPSEwKX1yZXR1cm4gdGhpcy5PZ30sWnE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlljJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5ZYz0hMCk7cmV0dXJuIHRoaXMuWWN9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5SYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oKXt0aGlzLnB0KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwKITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyMCl9LHB0OmZ1bmN0aW9uKCl7dGhpcy5tYz0hMDt2YXIgYj10aGlzLkRnKCk7aWYoYnx8dGhpcy50YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoaD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5rYigpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubmM9ITA7aWYoZS5BYSgiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwplLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLm5jPSEwO2UuQWEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLApmdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLm8oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDIwKX0sWnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmpnJiZiLmFkcyYmKHRoaXMuamc9Yi5hZHMpO3JldHVybiB0aGlzLmpnfSxybzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMucmEoKTt0aGlzLmZhKCEwKTt0aGlzLm8oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuT2UoKX0uYmluZCh0aGlzKSl9LGxkOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuWClob21hZFV0aWxzLkphJiYoYj0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwKNTApO3JldHVybn1iJiYoKGI9dGhpcy5EZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGtoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFyKCkpe3ZhciBhPXRoaXMudmIoKSxoPXRoaXMuUmIoKTthJiZoJiYodGhpcy52YigpLHRoaXMuUmIoKSx0aGlzLm1jfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWM/dGhpcy53KCk6KHRoaXMuZmEoITApLHRoaXMubygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnZiKCl9ZWxzZSB0aGlzLlBnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52YigpLGI9dGhpcy5SYigpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZmEoKSk6Cih0aGlzLmZhKCEwKSx0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5QZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxzbzpmdW5jdGlvbigpe3RoaXMucWN8fCh0aGlzLnFjPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5xYyE9Yi5hZHMuc3RhdGUmJih0aGlzLnFjPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLnFjKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMucWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNvKCl9LmJpbmQodGhpcyksCjEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sQ2E6ZnVuY3Rpb24oKXswPD1lLlNiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlQ/KHRoaXMuZGE9ITAsdGhpcy5zKCEwKSk6KHRoaXMuZGE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGE/KHRoaXMudygpLHRoaXMuc2EoKSk6dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy50YSgpfHwoYnx8KHRoaXMuV2g9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5JKHRoaXMuV2gsZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LHhvOmZ1bmN0aW9uKCl7dGhpcy5od3x8KDEwPHRoaXMuYXY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLAp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy50dCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54bygpfS5iaW5kKHRoaXMpLDUwKSkpfSx0dDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5idil7dGhpcy5idj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwKInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB6YT1jLnhtfHx6YTsoZnVuY3Rpb24oYyl7Yy56bT1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuSGgod2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLkhoKGJbaF0pfWNhdGNoKGQpe310aGlzLlIoKX19LEhoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuc2UoYSkpe2I9YTtmb3IodmFyIGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYT1uZXcgeWEoYltoXSksYS5xYXx8dGhpcy5OKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLlAoYSksKG5ldyB6YShhLHRoaXMuSykpLmcoKSkpO3JldHVybiEwfXJldHVybiExfSxSOmZ1bmN0aW9uKCl7dGhpcy5IYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSx0aGlzLkZjKX19KX0pKGMpOwp2YXIgQWE9Yy56bXx8QWEsQmE9bmV3IEFhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVsxXTt0aGlzLnd1PXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs2XTt0aGlzLm5sPXRoaXMuYVsxMF07dGhpcy5Rbj10aGlzLmFbOF07dGhpcy5IdT10aGlzLmFbN107dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxXX1jLmFqPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5UcTp0aGlzLnZ1KGEpfSx2dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3U6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkppOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ubDp0aGlzLlBuKGEpfSxQbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUW46dGhpcy5HdShhKX0sCkd1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IdTp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBDYT1jLmFqfHxDYSxzYz1uZXcgQ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1zYy5TcSg0KTsoZnVuY3Rpb24oYyl7Yy52bD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLlJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5wYSgpOwpyZXR1cm59dGhpcy5ZKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlooYik6dGhpcy5wYSgpfSxZczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnliLGg9dGhpcy5qYSgpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5VYiYmKDA8PWguaW5kZXhPZihkKXx8YS56ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuUmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKVGE6ZnVuY3Rpb24oKXt0aGlzLlJlKys7aWYoMTA8dGhpcy5SZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sTzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTWE6ZnVuY3Rpb24oKXt9LExkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgpiJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlYmJnRoaXMuVigpfX0pfSkoYyk7dmFyIERhPWMudmx8fERhOyhmdW5jdGlvbihjKXtjLnVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHphOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8KHRoaXMuemI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy56YisrLDE1PHRoaXMuemIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX19LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0KITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGg9Yi5nZXRFcnJvcigpO2lmKGguZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgaC5nZXRFcnJvckNvZGUmJmEoaC5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVD10aGlzLlR8fCExO3RoaXMuemEoKTsKdmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5NcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5zKCl9LmJpbmQodGhpcykpLHRoaXMuTXA9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5ZcyhhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy5JKGIpfX0pfSkoYyk7dmFyIEVhPWMudWx8fEVhOyhmdW5jdGlvbihjKXtjLndsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuU2E9MTUwMDt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgaD1uZXcgRGEoYlthXSk7aC5xYXx8dGhpcy5OKGgpfHwodGhpcy5QKGgpLChuZXcgRWEoaCx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEZhPWMud2x8fEZhLEdhPW5ldyBGYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53aT10aGlzLmFbOV07dGhpcy5RaT10aGlzLmFbOF07dGhpcy51dT10aGlzLmFbN107dGhpcy5DcD10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVsxMF19Yy5Dcz1iO2IucHJvdG90eXBlPXt2aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMud2k6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFpOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudXU6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEhhPWMuQ3N8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLnZpKDQpOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLkJnKGIsImVsZW1lbnRJRCIpO3RoaXMucGg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDsKaC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5waD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5uZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5kKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sd286ZnVuY3Rpb24oKXtlLlZnKHRoaXMubmQpO2UuQWUodGhpcy5uZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LApGZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIElhPWMua2t8fElhOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLm8oImV4dGVybmFsIik7dGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLmprfHxKYTsoZnVuY3Rpb24oYyl7Yy5saz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlNhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5CZyhiLCJlbGVtZW50SUQiKTtlLlZnKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkhiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT0KYy5sa3x8S2EsTGE9bmV3IEthKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlp0PXRoaXMuYVs0XTt0aGlzLlN0PXRoaXMuYVs4XTt0aGlzLndwPXRoaXMuYVszXTt0aGlzLklqPXRoaXMuYVs2XTt0aGlzLmJvPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzJdfWMuT249YjtiLnByb3RvdHlwZT17WXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlp0OnRoaXMuUnQoYSl9LFJ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5TdDp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud3A6dGhpcy5IaihhKX0sSGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklqOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ibzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBNYT0KYy5Pbnx8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuWXQoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLlJqPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LEd0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0saG46ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHk9Yy5Sanx8eTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGgsZCxmKXt0aGlzLiRhPWE7dGhpcy53Zz10aGlzLmZpPSExO3RoaXMubGg9ZDt0aGlzLkloPQohMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy4kYT1uZXcgeShhKSk7dmFyIGM9dGhpcy5wYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5FZSh0aGlzLiRhLnVybCkmJmwuTWQpe3ZhciBlPW5ldyB5KGEudXJsKTtlLkd0KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwua2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLmthKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1mJiYKNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuU2o9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMud2cmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkloP3RoaXMucGIub3Blbih0aGlzLiRhLm1ldGhvZCx0aGlzLiRhLnVybCwhMSk6dGhpcy5wYi5vcGVuKHRoaXMuJGEubWV0aG9kLHRoaXMuJGEudXJsLCEwKSx0aGlzLmZpfHwodGhpcy5wYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYVsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMucGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLnBiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5FZSh0aGlzLiRhLnVybCk/bC5NZD9sLmthKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkVlKHRoaXMuJGEudXJsKSx0aGlzLmxoJiZ0aGlzLmxoKCl9cmV0dXJuIHRoaXMucGJ9fX0pKGMpO3ZhciBOYT1jLlNqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSmE9ITE7dGhpcy5wYz0iIjt0aGlzLmNlPXRoaXMub2M9dGhpcy50Yj1udWxsO3RoaXMuUW89dGhpcy5GYj10aGlzLmJoPSExO3RoaXMuSWE9IiI7dGhpcy5YZz0hMTt0aGlzLkVhPXRoaXMucmQ9IiI7dGhpcy5UZz10aGlzLlg9dGhpcy5pc0VuYWJsZWQ9dGhpcy5ZZT0hMTt0aGlzLkJhPVtdO3RoaXMuSmc9dGhpcy5ZYj0iIjt0aGlzLmtlPSExO3RoaXMub2Y9MDt0aGlzLkRmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5LYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5nYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuJGI9IiI7dGhpcy5HYj1bXTt0aGlzLmFjPVtdO3RoaXMuWmI9IiI7dGhpcy5wZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnpjPSExO3RoaXMueW89dGhpcy5OZD1udWxsO3RoaXMuRWg9dGhpcy5OYz10aGlzLm9nPXRoaXMudGY9dGhpcy5NZD10aGlzLmZlPXRoaXMuUWM9ITE7dGhpcy5lYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy50ZD0wO3RoaXMuTGc9ITE7dGhpcy5LZz0xRTM7dGhpcy4kYz0hMTt0aGlzLk9hPTFFMzt0aGlzLkxmPSIifWMuVGo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5wYywKYWR0YWdtb2RpZmllcjp0aGlzLnRiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5vYyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuYmgsc2lkZWxvYWRzOnRoaXMuRmIsZGlzYWJsZXRlc3RzOnRoaXMuUW8saG9tYWRBbGlhczp0aGlzLklhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5YZyxnbG9iYWxDb25maWc6dGhpcy5yZCxjbGllbnRDb25maWc6dGhpcy5FYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlgsaXNCbG9ja2VkOnRoaXMuVGcsc2VydmVyOnRoaXMuQmEsc3ZtQ29uZmlnOnRoaXMuWWIsaG9tYWRBZHBhdGg6dGhpcy5KZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmtlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm9mLEhPTUFEX1ZFUklGSUVEOnRoaXMuRGYsSE9NQURfQkxPQ0tFRDp0aGlzLkJmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLktiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmdjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5DZiwKdGVzdEhpZGU6dGhpcy4kYix0ZXN0VGFnczp0aGlzLkdiLHRlc3RUYWdzSlM6dGhpcy5hYyx0ZXN0Q29va2llOnRoaXMuWmIsdGhyb3R0bGU6dGhpcy5wZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnpjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMueW8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5RYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuZmUsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudGYsY29uZmlnRmFpbHVyZXM6dGhpcy5lYixzaXRlQ29uZmlnOnRoaXMuWmEsc2VydmVySWQ6dGhpcy5BaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMudWMsdnBhaWQ6dGhpcy5OYyxza2lwQWxsb3dlZDp0aGlzLkVoLHZtYXBzOnRoaXMuYmksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLiRjLGFkRmFsbGJhY2tVUkw6dGhpcy5MZn19LENxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09CnR5cGVvZiB0aGlzLmViW2JdJiYxPT10aGlzLmViW2JdJiYoYT0hMCk7cmV0dXJuIGF9LGNmOmZ1bmN0aW9uKGEpe3RoaXMuZWJbYV09ITB9LGhxOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLmViKSJib29sZWFuIj09dHlwZW9mIHRoaXMuZWJbYl0mJjE9PXRoaXMuZWJbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sS2Q6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsCmRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuZm8oYSl9LHlhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5KYSYmIWIpcmV0dXJuIG5ldyB5KGEpO2Y9dGhpcy5EZShhKTtjPXRoaXMubGEoYSk7Zj8odGhpcy5CYygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5EZCgpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnBjfHx0aGlzLnRifHx0aGlzLm9jfHx0aGlzLmNlKSYmKGc9dGhpcy5OcihnKSk7YT1uZXcgeShlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmpxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnViKGcpOwphLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy5CYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sQmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQmEmJnRoaXMuQmEubGVuZ3RoJiYwPHRoaXMuQmEubGVuZ3RoJiYoYj10aGlzLkJhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7CnJldHVybiBhfSxFZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLkRlKGEpO3JldHVybiBifSxqcTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuSWEmJjA8dGhpcy5JYS5sZW5ndGgpcmV0dXJuIHRoaXMuSWE7Zm9yKGQgaW4gdGhpcy5JYSlpZihiPXRoaXMuSWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5WdjtyZXR1cm4ibm9uZSJ9LHVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmFbdGhpcy5BaF19LERkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZCgpLGI9dGhpcy5EaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpkLmxlbmd0aCldKX0saWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmxhKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxIPTA7SDxnLmxlbmd0aDtIKyspe3ZhciBrPWdbSF0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5paChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMuaWgoZC5xdWVyeUtleVtjXSwKYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sTnI6ZnVuY3Rpb24oYSl7dGhpcy5wYyYmKGErPXRoaXMucGMpO2lmKHRoaXMudGIpZm9yKHZhciBiIGluIHRoaXMudGIpdGhpcy50Yi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy50YltiXSkpO3RoaXMub2MmJihhPXRoaXMuTXIoYSx0aGlzLm9jKSk7cmV0dXJuIGF9LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLlhnPSEwO3RoaXMucmQ9YTt0aGlzLkVhPWI7dGhpcy5ZZT1kO3RoaXMuTmQ9Zjt0aGlzLnJjPWM7dGhpcy5aYT1lfHx7fTt0aGlzLkNyKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkVhKXRoaXMuQXIoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuRWEpdHJ5e3RoaXMuRWE9YigpLHRoaXMuZGQoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0sCmxiOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxDcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5yZCt0aGlzLiRkKCJnbG9iYWwiKSksdGhpcy54cS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZigiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRkKCl9LmJpbmQodGhpcyksITApfSxBcjpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHkodGhpcy5FYSt0aGlzLiRkKCJjbGllbnQiLC0xIT10aGlzLkVhLmluZGV4T2YoIj8iKSkpLHRoaXMuZGQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuY2YoImNsaWVudCIpO3RoaXMua2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6CiI/IikrKCJjYWNoZT0iK3RoaXMuRGIoKSk7dGhpcy5aYSYmdGhpcy5aYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGQ9IiIpO3RoaXMuWmEmJnRoaXMuWmEubm9DYWNoZUJ1c3RlciYmKGQ9IiIpO3JldHVybiBkfSxrYTpmdW5jdGlvbihhKXtpZighdGhpcy5mZSl7dGhpcy5mZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5yYz0hMSk7dGhpcy5yYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnJjP3RoaXMucmMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWD10aGlzLlRnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLkJmKSk7CnRoaXMuSWIoKTtlLnZjKGsuVXMpOyhiPWUuU2IodGhpcy51ZCgpKSl8fChiPWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHhxOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5FYXx8dGhpcy5ZYnx8dGhpcy5JYXx8dGhpcy5kZCgpOih0aGlzLkphPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5LYikpLHRoaXMuSWIoKSl9fSxkZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPQpKU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5FYX1lbHNlIGE9dGhpcy5FYTt0aGlzLmlzRW5hYmxlZD10aGlzLmJjKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLkJhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5CYS5sZW5ndGg7YisrKXRoaXMuQmFbYl09dGhpcy5CYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5ZYj1hLmNvbmZpZ3x8IiI7dGhpcy5JYT1hLmFsaWFzfHxudWxsO3RoaXMuSmc9YS5hZHBhdGh8fCIiO3RoaXMua2U9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5BaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlliJiZ0aGlzLklhJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkNjKCExKToodGhpcy5KYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSwKdGhpcy5JYigpKX0sQ2M6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHkodGhpcy5EZCgpKSxkPXRoaXMubGEodGhpcy5ZYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeSh0aGlzLlliK3RoaXMuJGQoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmV1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmthKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5DYyghMCl9LmJpbmQodGhpcyksITApfX0sZXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy56YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuemM9ITA7dGhpcy5DYyghMCk7cmV0dXJufX10aGlzLk1kPXRoaXMuYmMoYi5zdHJpY3QpO3RoaXMudGY9dGhpcy5iYyhiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5vZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMudWM9dGhpcy5iYyhiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuYmMoYi5lbmFibGVkKTt0aGlzLiRiPWIudGVzdGhpZGV8fCIiO3RoaXMuR2I9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmFjPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMucGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy50Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5vYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHwKbnVsbDt0aGlzLmJoPWIuanNwb3B1cHN8fCExO3RoaXMuRmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuTmM9Yi52cGFpZHx8ITE7dGhpcy5aYS52cGFpZD10aGlzLk5jO3RoaXMuRWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5hZD1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuYmk9Yi52bWFwc3x8IiI7dGhpcy4kYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuT2E9Yi5iaXRyYXRlfHwxRTM7dGhpcy5MZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5aYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLnJxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5rZSYmKHRoaXMuWmI9bnVsbCk7dGhpcy5wZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnpjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy56Yz0hMCx0aGlzLkNjKCEwKSk6CnRoaXMuaXNFbmFibGVkJiYhdGhpcy54dSgpJiYodGhpcy4kYnx8dGhpcy5hY3x8dGhpcy5HYnx8dGhpcy5aYik/dGhpcy5ZZT8odGhpcy5KYT10aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmxiKHRoaXMuS2IpKSx0aGlzLmhlKCksdGhpcy5JYigpKTp0aGlzLmt1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMubHUoKSl9fSxrdTpmdW5jdGlvbigpe3RoaXMuanUoKTt0aGlzLm11KCl9LG11OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgYz1lLmJhKDEwKSxnPWUuYmEoMTApLEg9ZS5iYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShnKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS51YihhKGMpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLnRjKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5rYigpKXtpZih0aGlzLlphJiZ0aGlzLlphLnBsYXllciYmdGhpcy5aYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5rYSgiY3NwXyIrCmIpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LGx1OmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpfSxMYzpmdW5jdGlvbihhKXt0aGlzLlFjPSEwO3RoaXMuWHx8KHRoaXMuWD10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYihhKSksdGhpcy5JYigpLHRoaXMuaGUoKSl9LGp1OmZ1bmN0aW9uKCl7aWYodGhpcy4kYil7dmFyIGE9ZS50YygpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMuYWgoKSl0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLiRiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuJGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsCiJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9MD09PWIub2Zmc2V0V2lkdGh8fDA9PT1iLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGIpO2E9ZH1jYXRjaChmKXt9YT90aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLk1oKCl9fWVsc2UgdGhpcy5NaCgpfSxMaDpmdW5jdGlvbigpe3ZhciBmO3ZhciBkO2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5EYigpKTt0aGlzLnB1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5nYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrCmYrIicgd2FzIGJsb2NrZWQiKX10aGlzLkdiPW51bGwsdGhpcy5sZigpfSxwdTpmdW5jdGlvbihhLGIsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sTWg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuRGIoKSk7dGhpcy5xdShmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuTGguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkxjKHRoaXMuZ2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuYWMmJnRoaXMuYWMubGVuZ3RoKXt2YXIgZD10aGlzLmFjLnNsaWNlKCksZjsKYS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkxoKCl9LHF1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7ZSgpJiZiKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gZz8od2luZG93LmNsZWFyVGltZW91dChnKSwhMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsZCl7ZD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxsZjpmdW5jdGlvbigpe3RoaXMuWmI/KHRoaXMub2YrKyx0aGlzLkthKG5ldyB5KHRoaXMuWmIpLAp0aGlzLml1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLm1mKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuSmgoKX0sbWY6ZnVuY3Rpb24oYSl7dGhpcy5MYyh0aGlzLkNmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMub2Y/dGhpcy5sZigpOnRoaXMubWYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLkpoKCk6dGhpcy5tZigiQUFBIil9LEpoOmZ1bmN0aW9uKCl7dGhpcy5YPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5sYih0aGlzLktiKSk7dGhpcy5JYigpO3RoaXMuaGUoKX0sYWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJgotMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sSWI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7dHJ5e2Uua2IoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5RYyYmKGI9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrYiwhMCk7IjEiPT09YiYmKGUuQWEoInQtb25saW5lLmRlIil8fGUuQWEoImdpZ2EuZGUiKXx8ZS5BYSgid2VsdC5kZSIpKSYmZS50cmFjaygic3RhdHNfaGRfYWJfaXNTdGV2ZSIsdGhpcy5haCgpLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubGIodGhpcy5EZikpO3RoaXMuTmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OZCYmdGhpcy5OZCgpfSx2bzpmdW5jdGlvbigpe2lmKHRoaXMudGYmJnRoaXMuQ3EoKSl7dmFyIGE9dGhpcy5ocSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sUWg6ZnVuY3Rpb24oYSl7YXx8CihhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sS2E6ZnVuY3Rpb24oYSxiLGQsZixjLGcpe3RoaXMudGR8fCh0aGlzLnRkPTApO3RoaXMudGQrKzt0aGlzLnRkPnRoaXMuS2cmJiF0aGlzLkxnJiYodGhpcy5MZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuS2csITApKTthPW5ldyBOYShhLGIsZCk7ZiYmKGEuZmk9ITApO2MmJmUuZHIoKSYmKGEud2c9ITApO2cmJihhLkloPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGRnOmZ1bmN0aW9uKCl7ZS5rYigpfHxlLldhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj0KbnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5rYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5CYygpfHwoYT10aGlzLmxhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpOwplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGZ1OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLmJpfSx1bzpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5WdS5iaW5kKHRoaXMpLHRoaXMuVXUuYmluZCh0aGlzKSl9LFZ1OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5KcCgpfSxVdTpmdW5jdGlvbigpe30sSnA6ZnVuY3Rpb24oKXtlLnZjKGsuSXApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMua2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LGhlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuRmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5GYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkZiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuaWEoKV09dGhpcztlLldhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHh1OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMucGZ9LHJxOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxEYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxiYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTsKcmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHViOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxnPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9nPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSxsYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csCmZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxEaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSxnPTE3MzI1ODQxOTMsaz00MDIzMjMzNDE3LGw9MjU2MjM4MzEwMixtPTI3MTczMzg3OCxyPTMyODUzNzc1MjAscCxxLHQsdSx2O3A9YS5sZW5ndGg7dmFyIHc9W107Zm9yKGY9MDtmPHAtMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdy5wdXNoKGMpO3N3aXRjaChwJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KHAtMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9CmEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gocD4+PjI5KTt3LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dy5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspZVtmXT13W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWVbZl09ZChlW2YtM11eZVtmLThdXmVbZi0xNF1eZVtmLTE2XSwxKTtjPWc7cD1rO3E9bDt0PW07dT1yO2ZvcihmPTA7MTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8fnAmdCkrdStlW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTIwOzM5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsCnU9dCx0PXEscT1kKHAsMzApLHA9YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhwJnF8cCZ0fHEmdCkrdStlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXQsdD1xLHE9ZChwLDMwKSxwPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsocF5xXnQpK3UrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT10LHQ9cSxxPWQocCwzMCkscD1jLGM9djtnPWcrYyY0Mjk0OTY3Mjk1O2s9aytwJjQyOTQ5NjcyOTU7bD1sK3EmNDI5NDk2NzI5NTttPW0rdCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoZykrYihrKStiKGwpK2IobSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE9hPWMuVGp8fE9hLGw9bmV3IE9hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkVwPXRoaXMuYVs1XTt0aGlzLmNzPXRoaXMuYVs3XTt0aGlzLmJtPQp0aGlzLmFbNl07dGhpcy5vcz10aGlzLmFbM107dGhpcy5WcT10aGlzLmFbMTBdO3RoaXMueHY9dGhpcy5hWzddO3RoaXMuZ3Q9dGhpcy5hWzVdO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbN119Yy5xbz1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRXA6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNzOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ibTp0aGlzLm5zKGEpfSxuczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMub3M6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMud3YoYSl9LHd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54djp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZ3Q6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5OdTp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBQYT1jLnFvfHxQYSx2Yz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy5EcCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixkKXt0aGlzLmI9YTthLmYuTz90aGlzLlhhPWEuZi5PKCk6dGhpcy5YYT0iIjthLmYuUmcmJmEuZi5SZyh7cGF1c2U6dGhpcy56ZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLnloLmJpbmQodGhpcyksbXV0ZTp0aGlzLk1lLmJpbmQodGhpcyksdW5tdXRlOnRoaXMuTHUuYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYi5mYjt0aGlzLnBsYXllcj10aGlzLmIuZjt0aGlzLlBiPXRoaXMuWmM9ITE7CnRoaXMuY289MUUzO3RoaXMuZWE9bnVsbDt0aGlzLkw9Yjt0aGlzLnhhPXt9O3RoaXMudmlkZW89e307dGhpcy5KZD17fTtlLmpiKCJuZXdCaWdBZElkIik7dGhpcy5ubz1lLmJhKDEwKTt0aGlzLmhmPTA7dGhpcy5YYz0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLlhjPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5mKSYmdGhpcy5iLmYudSYmKGE9dGhpcy5iLmYudSgpKSx0aGlzLlhjPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnBuPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuUGU9dGhpcy5JZD0hMTt0aGlzLmZoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmM9e307dGhpcy5WYz0hMTt0aGlzLlRoPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPQp0aGlzLlViPSExO3RoaXMuS289ZS5iYSgxMCk7dGhpcy5DYj1lLmJhKDEwKTt0aGlzLkFiPWUuYmEoMTApO3RoaXMuRmg9ZS5iYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuc2M9dGhpcy5CYj0hMTt0aGlzLm5lPW51bGw7dGhpcy5RZD10aGlzLkpiPXRoaXMueWU9dGhpcy5VZT10aGlzLmplPXRoaXMuamQ9dGhpcy5rZj10aGlzLm9iPXRoaXMuZWM9dGhpcy5uaD10aGlzLndjPXRoaXMuQXU9dGhpcy5yYj0hMTt0aGlzLmtjPVtdO3RoaXMuY2M9e307dGhpcy5xZj0hMTt0aGlzLldiPXt9O3RoaXMuUnM9MjAwO3RoaXMuemY9dGhpcy5laT10aGlzLmVlPXRoaXMuWGU9ITF9Yy5Oaj1iO2IucHJvdG90eXBlPXtCdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxSaDpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuUmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuTC5RYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLnYoay5mbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxIZTpmdW5jdGlvbihhLGIsZCxjKXt0aGlzLnJiPWQ7dmFyIG49ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKG49ITApO2lmKHRoaXMuTC5YKXRoaXMuaGYrKyxlLmpiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwudm8oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLkphJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLk5jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sCmNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKTpiPyh0aGlzLlJoKCksbmV3IFQodGhpcyxhLHRoaXMuZmgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkwuTmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk9hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6bixjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5QYSgpO2Vsc2V7dmFyIGc9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5IZShhLGIsZCl9LDUwKX19LFNlOmZ1bmN0aW9uKGEpe2EuVWEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7InNwaWVnZWwuZGUiIT1lLlNiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHx0aGlzLlBlfHwic3ZtcHJldmlldyIhPQplLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcj8odGhpcy5RZD10aGlzLkpiPXRoaXMud2M9ITEsdGhpcy5jPWEsdGhpcy5OdCh0aGlzLmMpLHRoaXMuR2coYSksdGhpcy5rYz10aGlzLnlnKGEpLHRoaXMuY2M9e30sdGhpcy5xZj0hMSx0aGlzLkZvKCkpOnRoaXMuaGQoKX0sR2c6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuSmQ9dGhpcy51cShhKSksdGhpcy5HZyhhLnBhcmVudCkpfSx5ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMueWcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5icShhKSkpO3JldHVybiBjfSxicTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPVtdO2lmKGEmJmEuVSYmYS5VLmdldEF0dHJpYnV0ZSl7Yj1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpOwphPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0wO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJgooZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5nYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlVhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MCxkPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLm1kJiZhLm1kLmVycm9yJiZhLm1kLmVycm9yLmNvZGUmJihiPWEubWQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5PYy5jb2RlOmI9PUYuVGQuY29kZT9lLnYoay5wdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpOihlLkllKCksYj09Ri5HZi5jb2RlJiZlLnYoay5Vcix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksCnRoaXMuQygpKSk7ZS52KGsuSHAsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LkVmLmNvZGU6ZS52KGsuV3UsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS52KGsudXYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5VZC5jb2RlOmUudihrLnZ2LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLlZyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS50cmFjaygibm9tZWRpYSIsCiIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnNjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksZD0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1kJiZhLmVycm9yJiZhLmVycm9yLndhJiYoZCs9Il8iK2EuZXJyb3Iud2EpO2UudHJhY2soZCwiIiwhMCk7dGhpcy5RYihhKTt0aGlzLlBhKCl9LFFiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk5hLnBvcCgpO3RoaXMuR2UoZC51cmwsZC50eXBlLGIpfWNhdGNoKGMpe319LE50OmZ1bmN0aW9uKGEpe3RoaXMuamU9dGhpcy55ZT10aGlzLlVlPSExO3RoaXMueGE9dGhpcy5iLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LQoxKTt0aGlzLnhhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJmQuZW52dmFycyl0cnl7Yj1kLmVudnZhcnMoKS52aWRlb1Nsb3QsdGhpcy5YZT0hMH1jYXRjaChjKXt9fWNhdGNoKGUpe31iLnJ3PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgZyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShnKSYmYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5wbiYmdGhpcy5wbGF5ZXIucGUoKSYmCihiLnZvbHVtZT10aGlzLnBsYXllci5wZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5NLmxlbmd0aDtkKyspYi5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuam4oYixhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLlhlJiZiLmxvYWQoKTtpZih0aGlzLk5oKGIpKXt0aGlzLm1uKGIpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5YZT90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLmVhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuR28oKT8KKGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZWE9dGhpcy54YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYiksdGhpcy5MdCgpKTp0aGlzLkNlKCk/dGhpcy5DaCgpOnRoaXMuYy5vcmlnaW4ucGcody5TZCl9LEx0OmZ1bmN0aW9uKCl7dGhpcy5vYj10aGlzLmVjPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoZS52KGsuaWcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm9iPSEwKTtlLmllKCk7dGhpcy5jJiZ0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLmZjJiZlLm5uKHRoaXMuYy5vcmlnaW4uZmMpO2UuYWIoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsCmEpO3RoaXMuYi5vaCgpO3RoaXMuYi5KYygpO2ZvcihhPXRoaXMuYi5HO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIuSmMoKTt0aGlzLmVhPXRoaXMueGE9dGhpcy5iLkc7dGhpcy52ZigidnBhaWQiKTtpZih0aGlzLm9iKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO2UudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApO2UudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9dGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5HLmFwcGVuZENoaWxkKHRoaXMuSCk7dGhpcy5ILm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5mLnVhJiZ0aGlzLmIuZi51YSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5jLndxKCksYz10aGlzLmMuQS5PcmlnaW5hbEFkUGFyYW1ldGVycyxnPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLlpmKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5MKTt0aGlzLkguc3JjPWE7ZS5hZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlRiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmtjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuZHYoKSx0aGlzLmIuVGIoITApLCF0aGlzLkpiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkpiPXtlbDp0aGlzLkgsY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuVGIoITApLHRoaXMuaHYoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLlRiKCEwKSx0aGlzLmx2KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmp2KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt2KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubXYoKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMuaXYoKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuY2koKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGc9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtnfHwoZz10aGlzLmMuT2IpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjsKdHJ5e3RoaXMuTC4kYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9Z31jYXRjaChkKXt3aW5kb3cub3BlbihnLGEpfX0uYmluZCh0aGlzKSw1MDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ndigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS52KGsuWmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ldigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuZWkmJih0aGlzLnpmPSExLHRoaXMuSWMoKSksdGhpcy5mdigpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLm9iPSEwLApiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwidXNlciIsITApLGUudihrLnhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLm9iPSExLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5zZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX19LmJpbmQodGhpcykpO2UuYWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5YZihmdW5jdGlvbihhKXtlLm1hKHRoaXMuSCwKInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMudHJhY2soInBhdXNlIik7ZS52KGsuWGQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pO3RoaXMuZWM9ITB9LGZ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbik7dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmVjPSExfSxodjpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudihrLlRmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGd2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpOwplLnYoay5TZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLmFiKCJpbXByZXNzaW9uIik7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuYWIoInN0YXJ0Iik7ZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sanY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7dGhpcy53Yz0hMDtlLmFiKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sa3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO2UuYWIoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sbXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7CmUuYWIoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxpdjpmdW5jdGlvbigpe3RoaXMuT2QoKTtlLmFiKCJjb21wbGV0ZSIpfSxjaTpmdW5jdGlvbihhKXtpZih0aGlzLkgmJnRoaXMuSC5wYXJlbnROb2RlJiZ0aGlzLkgucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLmFiKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLkgucGFyZW50Tm9kZTt0aGlzLkgucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkgpO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLmllKCk7dGhpcy5IPSExO3RoaXMuUGEoYSl9fSxjdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nLGM9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChjPWIubWF0Y2goZCkpP2Muam9pbiYmKGI9Yy5qb2luKCItIikpOgpiPWIuc3Vic3RyaW5nKDAsMjApKTtlLnRyYWNrKCJzdGF0c192cF9lcnJvcmhhbmRsZXIiLGIsITApO2UuYWIoImVyciIsYik7ZS52KGsubnYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmNpKCEwKX0sam46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5KYSYmYi5pc0VuYWJsZWQmJiFiLkJjKCkpe3ZhciBkPWIubGEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoYix0aGlzLkwpO2Mub25lcnJvcj10aGlzLiR1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYix0aGlzLkwpKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6CiEwfSxtbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy4kaC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy54Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk9kLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LEVkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLiRoLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnhmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuT2QuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUGQuYmluZCh0aGlzKSl9LCRoOmZ1bmN0aW9uKGEpe3RoaXMuUGJ8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYnx8dGhpcy53ZihhKX0uYmluZCh0aGlzKSx0aGlzLmNvKSl9LHdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlpjJiZ0aGlzLk5oKHRoaXMudmlkZW8pJiYhdGhpcy5CYiYmIXRoaXMuUGIpe3RoaXMuWmM9ITA7dHJ5e2lmKCFlLmtiKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLkVkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuTC5vZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwKIiIsITApfXRoaXMuWnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5KYygpO3RoaXMuWWgoKTt0aGlzLnZmKCk7dGhpcy4kZigpO3RoaXMuYi5vaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5qZigpfX0samY6ZnVuY3Rpb24oKXtpZighdGhpcy5qZClpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLlJhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLnNkPVtdO2Zvcih2YXIgYj10aGlzLmIuRyxkPTA7ZDxiLmNoaWxkcmVuLmxlbmd0aDtkKyspdGhpcy5zZC5wdXNoKGIuY2hpbGRyZW5bZF0pLGIuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT0ibm9uZSI7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7ZC5zZXRBdHRyaWJ1dGUoInNyYyIsCmEpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChkKTt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLlRjKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1jKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLlRjKCl9ZWxzZSB0aGlzLlRjKCl9LFRjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc2QpZm9yKHZhciBiPQowO2I8dGhpcy5zZC5sZW5ndGg7YisrKXRoaXMuc2RbYl0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChiPXRoaXMudmlkZW8ucGxheSgpKSYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKGIpe3RoaXMuamR8fChhPygic3RyaW5nIiE9dHlwZW9mIGImJmImJmIubWVzc2FnZSYmKGI9Yi5tZXNzYWdlKSx0aGlzLlBhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLGIsITApKToodGhpcy5NZSghMCksdGhpcy5UYyghMCkpKX0uYmluZCh0aGlzKSk7Yi50aGVuKGZ1bmN0aW9uKCl7dGhpcy55ZSYmZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VSZXNvbHZlZEFmdGVySW1wcmVzc2lvbiIsIiIsITApO3RoaXMuVWU9ITB9LmJpbmQodGhpcykpO2RhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5YYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwKdGhpcy5YYi5iaW5kKHRoaXMpKSk6Sz1mdW5jdGlvbigpe3RoaXMuVmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmpmKCkpfS5iaW5kKHRoaXMpO3RoaXMucmUoKS5CaCh0aGlzKX0sT2Q6ZnVuY3Rpb24oKXt0aGlzLkwudWMmJiF0aGlzLkJiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLnYoay5kbix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuUGEoKX0sUGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuamUpaWYodGhpcy5qZT0hMCx0aGlzLlFkfHwoZS52KGsuWnIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMucWJ8fHRoaXMuYy5pYyl7ZS5qYigibmV3U21hbGxBZElkIik7dGhpcy5oZisrO3RoaXMuUGI9dGhpcy5aYz0hMTt0cnl7dGhpcy5FZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMuZWEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLnhhLnJlbW92ZUNoaWxkKHRoaXMuZWEpfWNhdGNoKGMpe310aGlzLmNhcHRpb249CnRoaXMuY29udHJvbHM9bnVsbDt0aGlzLklkPSExO3RyeXt0aGlzLmIuVmgoKX1jYXRjaChnKXt9dGhpcy5rZj0hMDt0aGlzLmIudmUoKTt0aGlzLlViPSExO3RoaXMucmUoKS54aCgpO3RoaXMuYy5xYiYmdGhpcy5jLm9yaWdpbi5OZSgpO3RoaXMuYy5pYyYmKGE/dGhpcy5jLm9yaWdpbi5qaCgpOnRoaXMuaGQoKSl9ZWxzZSB0aGlzLmhkKCl9LCR1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRWQodGhpcy52aWRlbyksdGhpcy5DZSgpP3RoaXMuQ2goKTp0aGlzLlBkKGEpKX0sUGQ6ZnVuY3Rpb24oYSl7dGhpcy5QYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYKKHRoaXMuQ2UoKT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2N8fHRoaXMuTC5kZygpfS5iaW5kKHRoaXMpLDFFMyk6dGhpcy5MLmRnKCkpO3RoaXMuYy5vcmlnaW4ucGcody5TZCl9LHhmOmZ1bmN0aW9uKCl7aWYodGhpcy5BdSl0aGlzLlBhKCk7ZWxzZXt0aGlzLlViPSEwO3RoaXMuYi5mLlRhJiYhdGhpcy5rZiYmdGhpcy5iLmYuVGEoKSYmZS52KGsuZmQsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMuRHUoYSk7aWYoIXRoaXMuSmIpe3ZhciBiPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7CnRoaXMuSmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlFkPSEwO2UudihrLmFpLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLkJlKHRoaXMuSmIpfWQ9IiI7dGhpcy5jLmdmJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZoKSkmJihkPXRoaXMuYy5nZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5JZHx8KHRoaXMuSWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMucWI/KHRoaXMuUGI9dGhpcy5aYz0hMSwKdGhpcy5FZCh0aGlzLnZpZGVvKSx0aGlzLmVhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMueGEucmVtb3ZlQ2hpbGQodGhpcy5lYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLklkPSExLHRoaXMuYi5WaCgpLHRoaXMuYy5vcmlnaW4uTmUoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGIuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5YYy5yZXBsYWNlKCJbdGltZV0iLGUueGcodGhpcy5jLmR1cmF0aW9uLWEpKSk7dGhpcy5WYz0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sQ2g6ZnVuY3Rpb24oKXt0aGlzLnNjPSEwO3RoaXMueGE9dGhpcy5iLkc7dGhpcy54YS5pbm5lckhUTUw9IiI7dmFyIGE9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMueGEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsCiJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ2aXNpYmlsaXR5OiB2aXNpYmxlIik7YS5zZXRBdHRyaWJ1dGUoIkZsYXNoVmFycyIsImRhdGE9Iit0aGlzLnBxKCkpO2EuaW5uZXJIVE1MPSc8cGFyYW0gbmFtZT0iYWxsb3dzY3JpcHRhY2Nlc3MiIHZhbHVlPSJhbHdheXMiPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIj48cGFyYW0gbmFtZT0iYmdDb2xvciIgdmFsdWU9IiMwMDAwMDAiPjxwYXJhbSBuYW1lPSJvcGFxdWUiIHZhbHVlPSJkaXJlY3QiPic7CnRoaXMuYi5GPWE7dmFyIGI9dGhpcy5iLkYsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5lYT10aGlzLnhhLmFwcGVuZENoaWxkKGQpO3RoaXMuYi5KYygpO3RoaXMudmlkZW89dGhpcy5lYS5hcHBlbmRDaGlsZChiKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iMHB4IjtiLnN0eWxlLndpZHRoPXRoaXMueGEub2Zmc2V0V2lkdGgrInB4IjtiLnN0eWxlLmhlaWdodD10aGlzLnhhLm9mZnNldEhlaWdodCsicHgiO2Iuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjtiLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpO3RoaXMuZWEuYXBwZW5kQ2hpbGQoYik7dGhpcy5ZaCgpO3RoaXMudmYoKTt0aGlzLm5lPXNldEludGVydmFsKHRoaXMudG8uYmluZCh0aGlzKSwKMTAwKTtyZXR1cm4gYX0scHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxkPTA7ZDx0aGlzLmMuTS5sZW5ndGg7ZCsrKXt2YXIgYz1iPXRoaXMuYy5NW2RdLGU7ZT1iLnVybDt2YXIgZz10aGlzLkw7Zy5KYSYmZy5pc0VuYWJsZWQmJiFnLkJjKCkmJihlPWcubGEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Yy51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSx0bzpmdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLnZpZGVvLmdldEZsYXNoRGlzcGxheVN0YXR1cygpO3RoaXMudmlkZW8ucGF1c2VkPWEucGF1c2VkO2EudGltZT49dGhpcy5jLmR1cmF0aW9uPyhjbGVhckludGVydmFsKHRoaXMubmUpLHRoaXMuT2QoKSk6KDA8YS50aW1lJiYodGhpcy52aWRlby5jdXJyZW50VGltZT1hLnRpbWUsdGhpcy54ZigpKSwiZXJyb3IiPT1hLnN0YXR1cyYmKGNsZWFySW50ZXJ2YWwodGhpcy5uZSksCnRoaXMuUGQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxTaDpmdW5jdGlvbigpe3RoaXMubmh8fCh0aGlzLm5oPSEwLHRoaXMud2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxEdTpmdW5jdGlvbihhKXtlLnYoay5aZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2E9PXRoaXMuVGh8fHRoaXMuQmJ8fCgwPT1hJiYodGhpcy5yYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yYiksdGhpcy5yYj0hMSksdGhpcy5VZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy55ZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNoKCl9LmJpbmQodGhpcykpLHRoaXMuc2MmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLkJifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuc2MmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC51YyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMud2M9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSwKZS52KGsuTWYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudihrLlFmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwudWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSx0aGlzLlRoPWEpfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkJiKXt0cnl7aWYodGhpcy5jY1thXT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmNjLmltcHJlc3Npb24mJnRoaXMuY2MuY29tcGxldGUmJiF0aGlzLnFmKXt0aGlzLnFmPQohMDt2YXIgZD10aGlzLmNjLmNvbXBsZXRlLXRoaXMuY2MuaW1wcmVzc2lvbixjPSJzdGF0c19oZF90aW1lZGlmZiI7dGhpcy5IJiYoYys9InZwYWlkIik7NUUzPmQmJigxMD5kJiYoZD0xMCksMD5kJiYoZD0ibmVnYXRpdmUiKSxlLnRyYWNrKGMsZCwhMCkpfX1jYXRjaChnKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWQ9W107dHJ5e2Q9dGhpcy52cSh0aGlzLmMuTmEsYSl9Y2F0Y2gobCl7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIG09ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuSmQuaW1wcmVzc2lvbnMmJmUuYnIobS51cmwsdGhpcy5KZC5pbXByZXNzaW9ucyk/dGhpcy5HZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7CmUudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx7YWRJZDp0aGlzLkpkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLkMoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5HZShtLnVybCxtLnR5cGUpfWNhdGNoKHEpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuT28odGhpcy5jLk5hLGEpfWNhdGNoKHIpe319fSxHZTpmdW5jdGlvbihhLGIsZCxjLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxkJiZiLmhuKGQpLGN8fChjPXRoaXMubmcpLGV8fChlPXRoaXMubmcpLHRoaXMua24oYSksdGhpcy5MLkthKGIsZnVuY3Rpb24oKXt0aGlzLndoKGEpO2MoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMud2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGtuOmZ1bmN0aW9uKGEpe3RoaXMuV2JbYV09Im9wZW4ifSx3aDpmdW5jdGlvbihhKXt0aGlzLldiW2FdPSJjbG9zZWQifSxGbzpmdW5jdGlvbigpe3RoaXMuV2I9Cnt9fSxhdTpmdW5jdGlvbigpe3ZhciBhPTAsYjtmb3IoYiBpbiB0aGlzLldiKXRoaXMuV2IuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy5XYltiXSYmYSsrO3JldHVybiBhfSx2cTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LE9vOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFp1OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5aaC5iaW5kKHRoaXMpKX0sWmg6ZnVuY3Rpb24oKXt0aGlzLmMuT2ImJihlLnYoay5oZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSwhdGhpcy53YyYmZS5rYigpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuY3EoKSwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLiRjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5jLk9ifWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYy5PYixhKX19LmJpbmQodGhpcyksNTAwKSl9LFloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIiwKYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlhjLnJlcGxhY2UoIlt0aW1lXSIsZS54ZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5MLmFkJiYoYj10aGlzLkwuYWQpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMud2IuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZWEuYXBwZW5kQ2hpbGQoYSl9fSx3YjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmFkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSwKR2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5hZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHZmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy5Lbzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsCmZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGMuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixjLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5DYjtjLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5QaC5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlBoLmJpbmQodGhpcykpKTooYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuT2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5PaC5iaW5kKHRoaXMpKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5JYygpO3RoaXMuR2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnhiKCk7dGhpcy53YigpfS5iaW5kKHRoaXMpKTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9nLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGcuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixnLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtnLmlkPXRoaXMuQWI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5DdS5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkJ1LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO2cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuRmg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChjKTt0aGlzLmMuZ2YmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChnKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuSWMoKTt0aGlzLkdkKCl9LmJpbmQodGhpcykpO3RoaXMuZWEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy54YigpO3RoaXMud2IoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmVhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdPwpiLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy52YSYmKHRoaXMudmEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmIuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLApiLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMudmE9dGhpcy5lYS5hcHBlbmRDaGlsZChiKTt0aGlzLmIuWGYoZnVuY3Rpb24oYSl7dGhpcy52YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuTWUoKSk7dGhpcy54YigpfX0seGI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxJYzpmdW5jdGlvbigpe3RoaXMudmEmJiJibG9jayI9PXRoaXMudmEuc3R5bGUuZGlzcGxheXx8dGhpcy56Znx8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmIuRi5wYXVzZWQ/KHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sCnRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlVjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKToodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpKX0sUGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkNiKTt0aGlzLmVjPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInBsYXkiKSx0aGlzLnZhJiYodGhpcy52YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5lYz0hMSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwKInBhdXNlIiksdGhpcy52YSYmKHRoaXMudmEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMueGIoKSx0aGlzLndiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy5lYz0hMCl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5DYik7dGhpcy5iLkYucGF1c2VkfHwodGhpcy5iLkYucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudihrLlhkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx5aDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQ2IpO3RoaXMuYi5GLnBhdXNlZCYmKHRoaXMuYi5GLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLAp0aGlzLkMoKSkpfSxCdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLm11dGVkPyh0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sQ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLm9iPyhlLm1hKHRoaXMuSCwiY29udHJvbCIsInVubXV0ZSIpLAp0aGlzLm9iPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihlLm1hKHRoaXMuSCwiY29udHJvbCIsIm11dGUiKSx0aGlzLm9iPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYubXV0ZWR8fCh0aGlzLmIuRi5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay54ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTHU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5tdXRlZCYmKHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwiY29udGVudCIsITApLGUudihrLnNmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxYYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLlhiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5YYik7dGhpcy5qZHx8dGhpcy5WY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuamYoKSl9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3Ij09ZS5sYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3ImJihhPSEwLGIuYWRGYWxsYmFja1VSTHx8KGIuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtlLnRjKCk7aWYoKGF8fCF0aGlzLmVlJiYKYi5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuUGUpdGhpcy5QZT10aGlzLmVpPXRoaXMuemY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLCIiLCEwKSx0aGlzLmVlPSEwLGE9ZS5aZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5IZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pO2Vsc2UgaWYodGhpcy5qZD0hMCx0aGlzLnJiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJiKSx0aGlzLnJiPSExKSwoInByZXJvbGwiPT1lLlJhJiZ0aGlzLlZjfHwicG9zdHJvbGwiPT1lLlJhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybClpZihhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwsImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5SYSkpLCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKGI9dGhpcy5iLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuYi5KYygpOwp2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5rZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5rZCgpO2Vsc2UgdGhpcy5rZCgpfSxrZDpmdW5jdGlvbihhKXt0aGlzLmF1KCkmJiFhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksdGhpcy5Scyk6KHRoaXMua2Y9ITAsdGhpcy5iLnZlKCksdGhpcy5iLnZ0KCksdGhpcy5VYj0hMSxlLnYoay5Kbyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmUoKS54aCgpKX0scmU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmCihhPSEwKX1yZXR1cm4gYX0sJGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCJtaW5WaXMiKTthJiYoZS5BZSh0aGlzLnZpZGVvLGEpP3RoaXMueWgoKTp0aGlzLnpkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuT2IsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMucWIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5rYyYmMDx0aGlzLmtjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5rYykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5ubysKIi0iK3RoaXMuaGY7dGhpcy5jJiZ0aGlzLmMuQ2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkNnKCkpO3JldHVybiBhfSxuZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFFhPWMuTmp8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVsyXTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLnVpPXRoaXMuYVsxXTt0aGlzLkFpPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucG89YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmlrOnRoaXMuUXUoYSl9LFF1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5SdTp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ2s6dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnVpOnRoaXMuemkoYSl9LAp6aTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmE9Yy5wb3x8UmEsd2M9bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9d2MuaGsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5EYT1udWxsO3RoaXMuVz1bXTt0aGlzLlU9bnVsbDt0aGlzLmpjPXRoaXMubGM9ITE7dGhpcy5mYz0iIjt0aGlzLnlmPSExO2QmJmQuZW1wdHk/dGhpcy5GcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGgsZD1bXTtjLnVtPWI7Yi5wcm90b3R5cGU9Cntsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YygpLGI7Yj1lLmxhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB5KHRoaXMudXJsKTpsLnlhKGwuS2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7aWYodGhpcy5vcHRpb25zLnZwYWlkJiYhZS5rYigpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V8fGMpe2E9ZS5rZyh0aGlzLnVybCk7YXx8KGE9dGhpcy51cmwpO2lmKDA8PWRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigibWFydGhhc3Rld2FydCIpJiZ0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJiJHREZQIj09dGhpcy5vcHRpb25zLkFkU3lzdGVtfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJgowPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwiYXBwc3BvdCI9PWN8fDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8YS5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobC5LZChhKSkrIiZ0eXBlPWpzIixiPWwueWEobC5LZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpOmI9bC55YShsLktkKGEpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmCihiLmRhdGEuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhZmlsZSIpfWwuS2EoYix0aGlzLkVyLmJpbmQodGhpcyksdGhpcy5Cci5iaW5kKHRoaXMpKX0semc6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuRGEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLlJhKXRyeXt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwKInRleHQveG1sIik7Y1tiXT1kLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuRGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTt2YXIgYz1bXTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5SYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuUmF8fHRoaXMuZnIoYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fGwuZnUoKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTsKdmFyIGg9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZFtiXT1oLmZpcnN0Q2hpbGQ7Yy5wdXNoKGgpfWNhdGNoKGcpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoYyk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sZnI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbywKYz10aGlzLm9wdGlvbnMudGltZU9mZnNldERlbHRhfHwxMCxkPTA7aWYoIShhJiZiJiZiLmR1cmF0aW9uJiZiLmN1cnJlbnRUaW1lKSlyZXR1cm4hMTswPD1hLmluZGV4T2YoIiUiKT9kPWIuZHVyYXRpb24vMTAwKnBhcnNlSW50KGEpOjA8PWEuaW5kZXhPZigiOiIpJiYoMDw9YS5pbmRleE9mKCIuIikmJihhPWEuc3Vic3RyaW5nKDAsYS5pbmRleE9mKCIuIikpKSxhPWEuc3BsaXQoIjoiKSxhPWEucmV2ZXJzZSgpLGQ9cGFyc2VJbnQoYVswXSkrNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGQmJk1hdGguYWJzKGQtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1jPyEwOiExfSxFcjpmdW5jdGlvbihhKXt0aGlzLmx0KGEpO3RyeXt0aGlzLkRhPWEucmVzcG9uc2VYTUwsdGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMub2EodGhpcy5RYSh3LlVkKSl9dGhpcy5XPQp0aGlzLnpnKCk7dGhpcy5sYz10aGlzLm5mKCk7dGhpcy5qYz10aGlzLktoKCk7dGhpcy5XLmxlbmd0aD90aGlzLkVjKCk6dGhpcy5vYSh0aGlzLlFhKHcuT2Mse2Vycm9yOnRoaXMueWY/Ri5UZDpGLkZmfSkpfSxGcjpmdW5jdGlvbihhKXt0cnl7dGhpcy5EYXx8KHRoaXMuRGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuVWQpKX10aGlzLlc9dGhpcy56ZygpO3RoaXMubGM9dGhpcy5uZigpO3RoaXMuamM9dGhpcy5LaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5FYygpOnRoaXMub2EodGhpcy5RYSh3Lk9jLHtlcnJvcjp0aGlzLnlmP0YuVGQ6Ri5GZn0pKX0sQnI6ZnVuY3Rpb24oKXt0aGlzLm9hKHRoaXMuUWEody5FZix7ZGVwdGg6YX0pKX0sRWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5XLnNoaWZ0KCk7dGhpcy5ocigpP3RoaXMucnUoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5IZygpLGgsCntBZFN5c3RlbTp0aGlzLmFxKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMub2EodGhpcy5RYSh3LkhmKSk6KGE9MCx0aGlzLlN1KCkmJnRoaXMuU2UodGhpcy5MbygpKSl9LE5lOmZ1bmN0aW9uKCl7dGhpcy5sYz8odGhpcy5sYz0xPHRoaXMuVy5sZW5ndGgsdGhpcy5XLmxlbmd0aCYmdGhpcy5FYygpKTp0aGlzLnBhcmVudC5OZSgpfSxqaDpmdW5jdGlvbigpe3RoaXMuamM/KHRoaXMuamM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuRWMoKSk6dGhpcy5wYXJlbnQuamgoKX0sU3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdSgpP3RoaXMubnUoKT8hMDooLTEhPXRoaXMueGMoKT90aGlzLm9hKHRoaXMuUWEody5BZikpOnRoaXMub2EodGhpcy5RYSh3LmdqKSksITEpOih0aGlzLm9hKHRoaXMuUWEody5PYyxGLkdmKSksITEpfSxTZTpmdW5jdGlvbihhKXthLk5hPWEuTmEuY29uY2F0KHRoaXMuSmUoKSk7YS5xYj1hLnFiP2EucWI6dGhpcy5sYzthLmljPQphLmljP2EuaWM6dGhpcy5qYzthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7dGhpcy5wYXJlbnQuU2UoYSl9LExvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy54YygpO2EuTT10aGlzLkVnKCk7YS5PYj10aGlzLmVxKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy4kcCgpO2EuZ2Y9dGhpcy50cShhLmR1cmF0aW9uKTthLlVhPWEuVWE/YS5VYTotMSE9dGhpcy5mYy5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMudmc7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe2IuVWE9Yi5VYT9iLlVhOi0xIT10aGlzLmZjLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy52Zzt0aGlzLlUmJihiLk5hPWIuZXJyb3IuY29kZSE9dy5BZi5jb2RlP2IuTmEuY29uY2F0KHRoaXMuZnEoKSk6Yi5OYS5jb25jYXQodGhpcy5ucSgpKSk7dGhpcy5XLmxlbmd0aD8KKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5RYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LlFiJiZ0aGlzLnBhcmVudC5RYihiKSxhPTAsdGhpcy5FYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm9hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQub2EmJnRoaXMucGFyZW50Lm9hKGIpLGE9MCl9LFFiOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LlFiKGEpfSxwZzpmdW5jdGlvbihhLGIpe3RoaXMub2EodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgVGEoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxydTpmdW5jdGlvbigpe3JldHVybiBhPGh9LG91OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5FZygpLmxlbmd0aH0sbnU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLnhjKCl9LG5mOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5XLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LEtoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5uZigpJiYoYT0hMCk7cmV0dXJuIGF9LGx0OmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy5mYz1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMueWY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saHI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLkhnKCkubGVuZ3RofSxIZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LGFxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxKZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5VZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5nYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFVnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVWcoYS5wYXJlbnROb2RlKTohMX0sbnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sZnE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkplKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LGVxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApFZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxXdjphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5nYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sJHA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0seGM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5nYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSx0cTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLlh0KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmdiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sZ2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLnVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs3XTt0aGlzLmFrPXRoaXMuYVs1XTt0aGlzLmFzPXRoaXMuYVs1XTt0aGlzLmt0PXRoaXMuYVsxXTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLnp1PXRoaXMuYVs4XTt0aGlzLldvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5abj1iO2IucHJvdG90eXBlPXt6dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQXQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFrOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5hczp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmt0OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5VdDp0aGlzLnl1KGEpfSx5dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp1OnRoaXMuVm8oYSl9LFZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Xbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMuWm58fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLnp0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTmE9W107dGhpcy5NPVtdO3RoaXMuT2I9IiI7dGhpcy5BPXRoaXMuaWM9dGhpcy5xYj0hMTt0aGlzLndlPXRoaXMub3JpZ2luPW51bGw7dGhpcy54ZT0iIn1jLkpsPWI7Yi5wcm90b3R5cGU9e0dvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGxxOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2UmJgp0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uRGEpe3ZhciBhPXRoaXMub3JpZ2luLkRhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMud2U9YVtjXSl9cmV0dXJuIHRoaXMud2V9LENnOmZ1bmN0aW9uKCl7aWYodGhpcy54ZSlyZXR1cm4gdGhpcy54ZTt2YXIgYT0iIjsoYT10aGlzLmxxKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy54ZT1hfSx3cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMuSmx8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5qaj10aGlzLmFbOF07dGhpcy5Fbz10aGlzLmFbOF07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxMF19Yy56bj1iO2IucHJvdG90eXBlPXtpajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamo6dGhpcy5EbyhhKX0sRG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkVvOnRoaXMubGkoYSl9LGxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5taTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuem58fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLmlqKDQpO3ZhciB3PXtVZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix3YToiWE1MX1BBUlNFX0VSUk9SIn0sZ2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix3YToiRFVSQVRJT05fRVJST1IifSxPYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsd2E6IkVNUFRZX1ZBU1QifSxIZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix3YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sRWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCndhOiJMT0FEX0VSUk9SIn0sU2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHdhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sTnY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsd2E6Ik1FRElBRklMRV9FUlJPUiJ9LEFmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHdhOiJEVU1NWV9BRCJ9fSxGPXtGZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHdhOiJOT19BRFMifSxHZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsd2E6Ik5PX01FRElBRklMRVMifSxPdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsd2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix3YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VcD10aGlzLmFbNV07dGhpcy54cz10aGlzLmFbNl07dGhpcy5Bbz10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbMl19Yy5aaz1iO2IucHJvdG90eXBlPXtUcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXA6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuem8oYSl9LHpvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bbzp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlNvOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLlprfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5UcCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLm1kPWI7dGhpcy5OYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMud2o9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLndqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VbT10aGlzLmFbNF07dGhpcy5xcD10aGlzLmFbOV07dGhpcy5KdT10aGlzLmFbNF07dGhpcy5PaT0KdGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbOV19Yy5Ncz1iO2IucHJvdG90eXBlPXtUbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVW06dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuSXUoYSl9LEl1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5KdTp0aGlzLk5pKGEpfSxOaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9pOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy50bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuTXN8fFhhLEFjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLlRtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPQpifHx7fTt0aGlzLmY9YTt0aGlzLmZiPWEuQWcoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUuYmEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5ZZj0hMTt0aGlzLk5iPVtdfWMuaGo9YjtiLnByb3RvdHlwZT17VnA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGc9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2c9e3g6ZSx5OmJ9O2cucG9zaXRpb249YztyZXR1cm4gZ30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5WcChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZz10aGlzLkhxKGEpLGs9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2cmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpiLHk6Y307ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LGR1OmZ1bmN0aW9uKCl7dGhpcy5ZZj0hMH0sClZoOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvaDpmdW5jdGlvbigpe3RoaXMuZi5wYXVzZSgpO2UudihrLmZkLHRoaXMuZi51KCkpfSx2dDpmdW5jdGlvbigpe3RoaXMuWWZ8fCh0aGlzLmYucGxheSgpLGUudihrLmdkLHRoaXMuZi51KCkpKX0sSmM6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuZi5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLmZiLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5mYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLmZiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuZmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5mYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5mYik7dGhpcy5mLkdjJiZ0aGlzLmYuR2MoKT90aGlzLmYuQWcoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlRiLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZi5leGl0RnVsbHNjcmVlbigpfSxIcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFBwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sVGI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QcCh0aGlzLmZiKTtpZihiLnghPXRoaXMuRC54fHxiLnkhPXRoaXMuRC55fHxiLnBvc2l0aW9uIT10aGlzLkQucG9zaXRpb258fGIud2lkdGghPXRoaXMuRC53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuRC5oZWlnaHR8fGEpe2lmKDA8dGhpcy5ELndpZHRoJiYwPHRoaXMuRC5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLnZlKCk7cmV0dXJufXRoaXMuRD1iO3RoaXMuZi5HYygpPyh0aGlzLkcuc3R5bGUubGVmdD0KIjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLk5iLmxlbmd0aDthKyspdGhpcy5OYlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLkdoKHRoaXMuRykmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVGIuYmluZCh0aGlzKSwxMCl9LFhmOmZ1bmN0aW9uKGEpe3RoaXMuTmJ8fCh0aGlzLk5iPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5OYi5wdXNoKGEpfSx2ZTpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiYKdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5oanx8WWEsQz1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO08uc3R5bGUuZGlzcGxheT0iYmxvY2siO08uaWQ9ZS5iYSgxMCk7Ty5jb250cm9scz0hMDtDLnB1c2goTyl9dmFyIEs9ITEsZGE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix6KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BcD10aGlzLmFbOV07dGhpcy5uaj10aGlzLmFbM107CnRoaXMuWHM9dGhpcy5hWzhdO3RoaXMuRnU9dGhpcy5hWzhdO3RoaXMuZG09dGhpcy5hWzNdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Kbj1iO2IucHJvdG90eXBlPXt6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm5qOnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnU6dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmRtOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5majp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyICRhPWMuSm58fCRhLEJjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy56cCg0KTsoZnVuY3Rpb24oYyl7Yy5wbD11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5ZKGEpO3RoaXMuRmQoYik7dGhpcy5sZygpfSxGZDpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5aKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sZygpfS5iaW5kKHRoaXMpLAoxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0semU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx1OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5IYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9CmMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBhYj1jLnBsfHxhYjsoZnVuY3Rpb24oYyl7Yy5vbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZWEoKTt0aGlzLk1iPXRoaXMuTWJ8fCExO3RoaXMuUGY9dGhpcy5SZj10aGlzLlFnPXRoaXMuZGE9dGhpcy5yZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk5wKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5yZj0hMDt0aGlzLlFnJiZ0aGlzLmdnKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLnliO2EmJmEuVWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5jZCgpO3RoaXMuUWc9ITA7dGhpcy5nZygpfS5iaW5kKHRoaXMpKTt0aGlzLmJnKCl9LGdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTWIpe3RoaXMuY2QoKTtpZighdGhpcy5yZiYmIXRoaXMuY2QoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLnJmJiZ0aGlzLlBmJiYhdGhpcy5SZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVkKCl9LmJpbmQodGhpcyksMTAwKX19LGNkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSwKRmc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sYmc6ZnVuY3Rpb24oKXtpZih0aGlzLmNkKCkpe3ZhciBiPXRoaXMuRmcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5SZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLlBmPWIuVXZ9dGhpcy50YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKX0uYmluZCh0aGlzKSwxMDApfSxYdjpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5rdygpOiExfSx4YzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uPwpiLnhjKCk6LTF9LG9xOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LE5wOmZ1bmN0aW9uKGIsYSl7dGhpcy5NYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLk1ifHwzMDI9PXRoaXMuTWI/dGhpcy5kYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuTWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9LGVkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmRhPyh0aGlzLncoKSx0aGlzLnNhKCkpOmIuemUoKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcShiKT8odGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMkUzKSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgYmI9Yy5vbHx8YmI7KGZ1bmN0aW9uKGMpe2MucWw9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxlcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5ObC5abS5YbT93aW5kb3cuT08uTmwuWm0uWG0uU3YoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZXIoKX0sMTAwKX0sZzpmdW5jdGlvbigpe3RoaXMuU2E9MTUwMDt2YXIgYj1lYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5zZShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgYWIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuTihjKXx8KHRoaXMuUChjKSwobmV3IGJiKGMsCnRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgY2I9Yy5xbHx8Y2IsZGI9bmV3IGNiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVs2XTt0aGlzLlNrPXRoaXMuYVsxXTt0aGlzLnlpPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLiRuPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tbzp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2s6dGhpcy54aShhKX0seGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlpOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGViPWMuJG58fGViLENjPW5ldyBlYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5sbyg0KTsoZnVuY3Rpb24oYyl7Yy5WaT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLnFhPSExO3RoaXMuSWcoKX0sSWc6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSYmKGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCYmKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTtiJiZhPyh0aGlzLlkoYiksdGhpcy5aKGEpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXREdXJhdGlvbigpfSxNYTpmdW5jdGlvbigpe3RoaXMuc2goKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCk7MT50aGlzLmdldER1cmF0aW9uKCktYj90aGlzLlYmJigwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2goKX0uYmluZCh0aGlzKSwxMDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpOwp2YXIgZmI9Yy5WaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sY2c6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLHRoaXMuc2EoKSk6MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/dGhpcy5zYSgpOnRoaXMucygpKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5jZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmNnKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LApzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5VaXx8Z2I7KGZ1bmN0aW9uKGMpe2MuV2k9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSx2aDpmdW5jdGlvbihiKXtiPW5ldyBmYihiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KGIuRmQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUChiKSwobmV3IGdiKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe3RoaXMuT3B8fCh0aGlzLk9wPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy52aChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnZoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5XaXx8aGIsVT1uZXcgaGIocik7VS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucms9dGhpcy5hWzNdO3RoaXMudW49dGhpcy5hWzRdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRG49dGhpcy5hWzldO3RoaXMuUnI9dGhpcy5hWzVdO3RoaXMuYW49dGhpcy5hWzNdO3RoaXMuVWs9dGhpcy5hWzZdO3RoaXMuaj10aGlzLmFbM119Yy5xcj1iO2IucHJvdG90eXBlPXtxazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucms6dGhpcy50bihhKX0sdG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51bjp0aGlzLkJrKGEpfSwKQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkNrOnRoaXMuQ24oYSl9LENuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Ebjp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnI6dGhpcy4kbShhKX0sJG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMucXJ8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnFrKDQpOyhmdW5jdGlvbihjKXtjLmdtPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlkoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5TLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5nbXx8VjsoZnVuY3Rpb24oYyl7Yy5mbT0Kdi5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5XYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3guV2MoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5ocyhhKX0uYmluZCh0aGlzKSk7eC5XYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt4LldjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eC5CcSgpfSxoczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT0KaXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5zYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuZm18fFc7KGZ1bmN0aW9uKGMpe2MuaG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnlkJiYoYj1lLlBvKGIsdGhpcy55ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBWKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUChkKTt2YXIgZj1uZXcgVyhkLHRoaXMuSyk7Zi5nKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMueWR8fCh0aGlzLnlkPVtdKSx0aGlzLnlkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxXYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fAoodGhpcy5jYVtiXT17fSk7dGhpcy5jYVtiXVthXXx8KHRoaXMuY2FbYl1bYV09W10pO3RoaXMuY2FbYl1bYV0ucHVzaChjKX0sc3U6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5jYXx8dGhpcy5jYSYmIXRoaXMuY2FbYV0pdGhpcy5EY3x8KHRoaXMuRGM9W10pLHRoaXMuRGMucHVzaChiKSx0aGlzLnV0KCkmJih0aGlzLiRlKCksdGhpcy5nKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbYV1bY10mJjA8dGhpcy5jYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LEJxOmZ1bmN0aW9uKCl7aWYodGhpcy5EYylmb3IodmFyIGI9MDtiPHRoaXMuRGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5EY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT0KdHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2NdW2RdJiYwPHRoaXMuY2FbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5jYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuY2FbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ4LnN1KGIpfX0pfSkoYyk7dmFyIGpiPWMuaG18fGpiLHg9bmV3IGpiKHIpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMTBdfWMuJGk9YjtiLnByb3RvdHlwZT17cWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuJGl8fGtiLEVjPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLnFqKDQpOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5ZKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sClRhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5SaXx8bGI7KGZ1bmN0aW9uKGMpe2MuU2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fAphLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5vKCJub0FkIiwicGxheWVkIiksdGhpcy5JKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJub0FkIiwicGxheWVkIik7dGhpcy5JKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuU2l8fG1iOyhmdW5jdGlvbihjKXtjLlRpPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGc9bmV3IGxiKGQpO3RoaXMuTihnKXx8KHRoaXMuUChnKSwobmV3IG1iKGcsdGhpcy5LKSkuZygpKX1jYXRjaChrKXt9fXRoaXMuUigpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYT09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVtiLmphKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuVGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5EaT1iO2IucHJvdG90eXBlPXtmczpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5EaXx8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlkoYik7dGhpcy5aKGEpO3RoaXMubnQodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSwKcGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LG50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5oYS5tdXRlJiZ0aGlzLmhhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmCmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFJnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuWGt8fHFiOyhmdW5jdGlvbihjKXtjLldrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5kaT0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy5kaSYmKHRoaXMuSSgpLHRoaXMuZGk9ITAsdGhpcy5yYSgpKTthLkhhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuSSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciByYj1jLldrfHxyYjsKKGZ1bmN0aW9uKGMpe2MuWWs9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5Za3x8c2IsWD1uZXcgc2Iocik7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuSG09dGhpcy5hWzJdO3RoaXMuSXY9dGhpcy5hWzVdO3RoaXMuS3I9dGhpcy5hWzZdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMuaj0KdGhpcy5hWzNdfWMuZW09YjtiLnByb3RvdHlwZT17Um46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNuOnRoaXMuR20oYSl9LEdtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IbTp0aGlzLkh2KGEpfSxIdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSXY6dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMua20oYSl9LGttOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB0Yj1jLmVtfHx0YixHYz1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Sbig0KTsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxNYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41Pgp0aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlY/KDAsdGhpcy5WKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDQwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdWI9Yy5FbXx8dWI7KGZ1bmN0aW9uKGMpe2MuRG09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sUmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LG10OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5ZYXx8KHRoaXMuWWE9W10pO3RoaXMuWWEucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PQphLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5zYSgpOnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm1jPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphP3RoaXMubXQodGhpcy56YSk6KHRoaXMuemE9dGhpcy5SYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMubWMpe3RoaXMuSSgpO3JldHVybn1iPSEwO2lmKHRoaXMuWWEmJgp0aGlzLllhLmxlbmd0aCYmMTx0aGlzLllhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuWWEubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuWWFbYV0mJjMwMyE9dGhpcy5ZYVthXSYmNDAzIT10aGlzLllhW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5zYSgpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5EbXx8dmI7KGZ1bmN0aW9uKGMpe2MuRm09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB1YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUChjKSwKKG5ldyB2YihjLHRoaXMuSykpLmcoKSl9dGhpcy5SKCl9fSl9KShjKTt2YXIgd2I9Yy5GbXx8d2IseGI9bmV3IHdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVwPXRoaXMuYVs2XTt0aGlzLkxpPXRoaXMuYVs5XTt0aGlzLnNwPXRoaXMuYVs1XTt0aGlzLkxuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTHI9YjtiLnByb3RvdHlwZT17dHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cDp0aGlzLktpKGEpfSxLaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGk6dGhpcy5ycChhKX0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnNwOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB5Yj1jLkxyfHx5YixIYz0KbmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMudHAoNCk7KGZ1bmN0aW9uKGMpe2MuVmw9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuVGU9ITF9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLlpzKCl9LmJpbmQodGhpcyksNTAwKX0sWnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuVGUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuVGUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PQpiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sJHQ6ZnVuY3Rpb24oKXt0aGlzLlRlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5WbHx8emI7KGZ1bmN0aW9uKGMpe2MuVWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmRjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLklyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5kY3x8KHRoaXMuZGM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy5zKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuZGN8fHRoaXMuZGMrKyx0aGlzLmRjPD10aGlzLklyPyh0aGlzLmRjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS4kdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5VbHx8QWI7KGZ1bmN0aW9uKGMpe2MuV2w9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5XbHx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVszXTt0aGlzLmNuPXRoaXMuYVszXTt0aGlzLkZpPXRoaXMuYVs1XTt0aGlzLnNpPXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVs5XTt0aGlzLk5uPXRoaXMuYVsyXTt0aGlzLnBqPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzEwXX1jLnlxPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5HbDp0aGlzLmJuKGEpfSxibjpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmNuOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5GaTp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkxwOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLm9qKGEpfSxvajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucGo6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMueXF8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZsKDQpOyhmdW5jdGlvbihjKXtjLlNsPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksCmE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuVigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYSgpfS5iaW5kKHRoaXMpLDIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLlNsfHxFYjsoZnVuY3Rpb24oYyl7Yy5SbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuSG8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiPXRoaXMucGQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnpyKCk6dGhpcy5mZygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LEhvOmZ1bmN0aW9uKCl7dGhpcy5OZigpfHx0aGlzLnMoITApfSx6cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTshYi5uYSYmYi5XJiZiLlJ2JiZiLlR2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sZmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMudygpLHRoaXMuc2EoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKX0uYmluZCh0aGlzKSwxMDApfSxwZDpmdW5jdGlvbigpe2lmKCF0aGlzLm1oKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5IYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5taD1iW2NdKTtyZXR1cm4gdGhpcy5taH0sbHc6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMucGQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKToKdGhpcy5JKCk6dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZiPWMuUmx8fEZiOyhmdW5jdGlvbihjKXtjLlRsPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYixIYj1uZXcgR2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlNtPXRoaXMuYVs2XTt0aGlzLm5rPXRoaXMuYVs3XTt0aGlzLk1rPXRoaXMuYVs0XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy5lcz10aGlzLmFbNl07dGhpcy5tcD10aGlzLmFbNF07dGhpcy5Zbz10aGlzLmFbMl07dGhpcy5Gcz10aGlzLmFbMl07dGhpcy5Baz10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs5XX1jLnJtPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TbTp0aGlzLm1rKGEpfSxtazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubms6dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1rOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Hajp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZXM6dGhpcy5scChhKX0sbHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1wOnRoaXMuWG8oYSl9LFhvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/CnRoaXMuWW86dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZzOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWs6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBJYj1jLnJtfHxJYixKYz1uZXcgSWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5SbSg0KTsoZnVuY3Rpb24oYyl7Yy5Paz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RyYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlkoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5wYSgpfWVsc2UgdGhpcy5wYSgpfSxpdzpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuU2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sVGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiYhYi5wYXVzZWQ/Cih0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxHYzpmdW5jdGlvbigpe3JldHVybiEwfSxIYTpmdW5jdGlvbigpe3ZhciBiO0c/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFk9Yy5Pa3x8WTsoZnVuY3Rpb24oYyl7Yy5Oaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5WZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlZlPWIuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPQphLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlZlJiZiIT10aGlzLlZlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuQWEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm93KSx0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFo9Yy5Oa3x8WjsoZnVuY3Rpb24oYyl7Yy5Qaz1xLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJgp3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEcpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWShiKSxiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWShiKSxiLnFhP3RoaXMuJGUoKTp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgWihiLHRoaXMuSyksYi5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIEcsSmI9Yy5Qa3x8SmIsS2I9bmV3IEpiKGhhKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuc249dGhpcy5hWzEwXTt0aGlzLlVvPXRoaXMuYVs4XTt0aGlzLlBsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMucnM9YjtiLnByb3RvdHlwZT17Smo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktqOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbjp0aGlzLlRvKGEpfSxUbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW86dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlBsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTGI9Yy5yc3x8TGIsS2M9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLkpqKDQpOyhmdW5jdGlvbihjKXtjLk9tPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGImJmJbMF0pe2Zvcih2YXIgYT1iPWJbMF07YSYmYS5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1hLnBhcmVudE5vZGUubm9kZU5hbWUpe2E9YS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlkoYSk7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuUmQ9ITF9Y2F0Y2goYil7fWlmKCJhZFJlcXVlc3QiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLlJkfHwodGhpcy5SZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX1lbHNlIHRoaXMucGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5ETDhfb25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCl9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxUYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuT218fE1iOyhmdW5jdGlvbihjKXtjLk5tPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LG90OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYmQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmJkKGEpfS5iaW5kKHRoaXMpKX0sYmQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksCnRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxLZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5iZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnRhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuS2YuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5vdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLktmKCl9fSl9KShjKTt2YXIgTmI9Yy5ObXx8TmI7KGZ1bmN0aW9uKGMpe2MuUG09cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5xYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuUG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzNdO3RoaXMuaGw9dGhpcy5hWzVdO3RoaXMudXI9dGhpcy5hWzddO3RoaXMuTW09dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOV19Yy5BbT1iO2IucHJvdG90eXBlPXtCdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ3Y6dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy51cjp0aGlzLkxtKGEpfSxMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLk1tOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUWI9Yy5BbXx8UWIsTGM9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuQnYoNCk7KGZ1bmN0aW9uKGMpe2MucG09dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5xaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuWShhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlNyPQphfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX1lbHNlIHRoaXMucGEoKX0sdHc6ZnVuY3Rpb24oKXt9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuU3J9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxPOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LE1hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkxkKGIpfS5iaW5kKHRoaXMpKX0sTGQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucWgmJih0aGlzLnFoPSEwLHRoaXMuViYmdGhpcy5WKCkpfX0pfSkoYyk7dmFyIFA9Yy5wbXx8UDsoZnVuY3Rpb24oYyl7Yy5vbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx6YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy56Ynx8Cih0aGlzLnpiPTApLHRoaXMuemIrKywxNTx0aGlzLnpiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkt0KCk6dGhpcy5zKCEwKSwhMDt0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnMoKTp0aGlzLnMoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZGF8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56YSgpfS5iaW5kKHRoaXMpLDEwKX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVD1hLGIubygiYWRlcnJvciIsYSkpOmIubygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9CmIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5UPXRoaXMuVHx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnphKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUT1jLm9tfHxROyhmdW5jdGlvbihjKXtjLnFtPQpxLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYik7dGhpcy5TYT0tMX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IFAod2luZG93Lmluc2VydGVkUGxheWVyKTtiLnFhfHx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBRKGIsdGhpcy5LKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IFAod2luZG93LlRWMlBsYXllcnNbYV0pLGIucWF8fAp0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgUShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLiRlKCk7dGhpcy5SKCl9fSl9KShjKTt2YXIgUmI9Yy5xbXx8UmIsU2I9bmV3IFJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVs5XTt0aGlzLkNvPXRoaXMuYVs5XTt0aGlzLnluPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzEwXX1jLkRzPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQ286dGhpcy54bihhKX0seG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy55bjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFRiPWMuRHN8fFRiLE1jPW5ldyBUYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy54cCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz11LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlkoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpO2EmJnRoaXMuWShhLnBhcmVudE5vZGUpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBhYT1jLkZrfHxhYTsoZnVuY3Rpb24oYyl7Yy5Faz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuTmc9MDt0aGlzLlQ9dGhpcy5UfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuZGE9dGhpcy5BYz10aGlzLnphPXRoaXMuWWM9ITE7dGhpcy51aD1lLkRiKDEwKTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnN1YlBsYXllciYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm5hPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5uYigpLCEwO3RoaXMuTmcrKztpZigxMDx0aGlzLk5nKXRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnMoITApOnRoaXMucygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2cuYmluZCh0aGlzKSwKMTAwKSwhMX0sbmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5hO2lmKGIpe3ZhciBhPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsCiEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMudGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMjApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpOwppZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kYT8odGhpcy53KCksdGhpcy5zYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmCmEuYXBpLnBsYXllZCgpP3RoaXMuSShiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmE9Yy5Fa3x8YmE7KGZ1bmN0aW9uKGMpe2MuR2s9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IGFhKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYj1uZXcgYWEod2luZG93LnBsYXllciksdGhpcy5OKGIpfHwKKHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBVYj1jLkdrfHxVYixWYj1uZXcgVWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXE9dGhpcy5hWzldO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzhdO3RoaXMuR3Y9dGhpcy5hWzZdO3RoaXMua3A9dGhpcy5hWzZdO3RoaXMuQ209dGhpcy5hWzRdO3RoaXMubnI9dGhpcy5hWzZdO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbN119Yy5OcT1iO2IucHJvdG90eXBlPXt6cTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQXE6dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMuaG8oYSl9LGhvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pbzp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLkd2OnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5rcDp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5tcihhKX0sbXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5yOnRoaXMuSXMoYSl9LElzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuTnF8fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLnpxKDQpOyhmdW5jdGlvbihjKXtjLkJqPXUuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5wYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLkJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIFliPWMuQWp8fFliOyhmdW5jdGlvbihjKXtjLkNqPXEuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIucWEpe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuQ2p8fFpiLCRiPW5ldyBaYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMV07dGhpcy5Ldj10aGlzLmFbMTBdO3RoaXMuSWw9dGhpcy5hWzRdO3RoaXMudHM9dGhpcy5hWzEwXTt0aGlzLnZzPXRoaXMuYVs5XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLkNsPXRoaXMuYVs4XTsKdGhpcy5KcT10aGlzLmFbMTBdO3RoaXMuVHM9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNF19Yy5xbj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy5KdihhKX0sSnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkt2OnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52czp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNsOnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KcTp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5xbnx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuYmsoNCk7KGZ1bmN0aW9uKGMpe2MuaGk9dS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLnBhKCkpOnRoaXMucGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7dmFyIGJjPWMuaGl8fGJjOyhmdW5jdGlvbihjKXtjLmdpPQp2LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5hZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVD1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSx2ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhfSxDYTpmdW5jdGlvbigpe3RoaXMuZGE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmdldFNlbGVjdGVkQWRIYW5kbGVyKWlmKChiPQpiLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8LTEhPWFbY10uaW5kZXhPZigiNDAzIikpKXtiPSEwO2JyZWFrfWlmKGFbY10mJgooMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnNhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy50YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMucygpOnRoaXMucyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLDEwMCl9fSxzOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmEuYmluZCh0aGlzKSwKMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5naXx8Y2M7KGZ1bmN0aW9uKGMpe2MuaWk9cS5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxWYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLnFhP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlZhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5WYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlIoKX19KX0pKGMpO3ZhciBkYz1jLmlpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkhzPXRoaXMuYVszXTt0aGlzLmtvPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5saj10aGlzLmFbM107dGhpcy5waT10aGlzLmFbNF07dGhpcy5KbT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs2XX1jLkRrPWI7Yi5wcm90b3R5cGU9e0dzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua286dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJzOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sajp0aGlzLm9pKGEpfSxvaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucGk6dGhpcy5JbShhKX0sSW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmM9Yy5Ea3x8ZmMsUGM9bmV3IGZjKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLkdzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLllnPXRoaXMuJGc9dGhpcy5aZz0hMTt0aGlzLkFkPVtdO3RoaXMuWmU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBCYT9udWxsOkJhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFU/bnVsbDpVLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgR2E/bnVsbDpHYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB3YT9udWxsOndhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBTYj9udWxsOlNiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGE/bnVsbDpMYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWD9udWxsOlh9fWMuTGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5xcShhKTpbXSxiO3RoaXMuJGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuWmc9ITA7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnpoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5aZSl7aWYodGhpcy5ZZylicmVhaztiPXRoaXMuWmVbY107dGhpcy51ZihiKSYmKHRoaXMuQWQucHVzaChiKSx0aGlzLnpoKGIpKX19LHVmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuWmVbY10sdGhpcy51ZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx6aDpmdW5jdGlvbihhKXt0aGlzLnVmKGEpJiZhLmcoKX0sYnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHUmJiF0aGlzLlpnKWZvcih0aGlzLllnPSEwLGE9MDthPHRoaXMuQWQubGVuZ3RoO2ErKyl0aGlzLkFkW2FdLkhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWRbYV0uSGIpfX19KShjKTt2YXIgZ2M9CmMuTGx8fGdjLE49bmV3IGdjO04uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNpPXRoaXMuYVsxMF07dGhpcy5ScT10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbMV07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5qbT10aGlzLmFbNV07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5ldD10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs3XX1jLlF0PWI7Yi5wcm90b3R5cGU9e0JpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ2k6dGhpcy5RcShhKX0sUXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ScTp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnY6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxzOnRoaXMuaW0oYSl9LGltOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qbTp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBxOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMuUXR8fGhjLFFjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLkJpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKwoxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS52YyhrLlR1KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS52YyhrLldyKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IEosbT0hMTtJLmlhKCk7SS5TZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuaWEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LAohMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5TZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuaWEoKTt2YXIgU2M9UmMoZnVuY3Rpb24oKXtlLnVnKHdpbmRvdyxJLlhxKCkse2lkOlNjfSl9LDUwMCksamE9ZS5iYSgxMCk7ZmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy53bT10aGlzLmFbMl07dGhpcy4kbD10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbNV07dGhpcy5laz10aGlzLmFbMl07dGhpcy5HcD10aGlzLmFbM107dGhpcy5Fdj10aGlzLmFbMTBdO3RoaXMuenY9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzFdfWMubmk9YjtiLnByb3RvdHlwZT17dm06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLndtOnRoaXMuWmwoYSl9LFpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbDp0aGlzLmNwKGEpfSxjcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmVwOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZWs6dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdwOnRoaXMuRHYoYSl9LER2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fdjp0aGlzLnl2KGEpfSx5djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuenY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgaWM9Yy5uaXx8aWMsVGM9bmV3IGljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMudm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnJoPXRoaXMuY29uZj10aGlzLmhiPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuWGE9IiI7dGhpcy5CZD1bXTt0aGlzLkNkPTA7dGhpcy50aD0hMTt0aGlzLldlPQpbXTtlLmpiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5qaT1iO2IucHJvdG90eXBlPXtJdDpmdW5jdGlvbihhKXt0aGlzLnJoPWF9LGVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5YYT10aGlzLnBsYXllci5PKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRHQ6ZnVuY3Rpb24oYSl7dGhpcy5oYj1hfSxDdDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlhhXSYmdGhpcy5jb25mW3RoaXMuWGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5YYV1bYV0pO3JldHVybiBifSxIYzpmdW5jdGlvbihhLGIpe2UuQWEoIndlbHQuZGUiKSYmZS5XYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuaGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcSgpKXRoaXMuaGIubCh0aGlzLmhiLnJkLHRoaXMuaGIuRWEsdGhpcy5oYi5ZZSxmdW5jdGlvbigpe3RoaXMuSGMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmhiLnJjKTtlbHNlIGlmKHRoaXMuRHEoKSl0aGlzLnl0KGZ1bmN0aW9uKCl7dGhpcy5IYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgWWEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmR1KCk7bC5leGl0RnVsbHNjcmVlbigpO2UuamIoIm5ld0hvbWFkRGlzcGxheSIpO1M9bD1uZXcgUWEobCx0aGlzLmhiLGcpO2wuQnQodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEobSl9KGE9dGhpcy5IcihhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkZlJiYoYz10aGlzLnBsYXllci5GZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5IZShhLGMsZik7dGhpcy5wbGF5ZXIuQmgobCl9fSxZcTpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LFd0OmZ1bmN0aW9uKCl7ZS5qYigicHJlcm9sbCIpO2UuZGYoInByZXJvbGwiKTt2YXIgYT10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkdhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5xZyhhKSk/dGhpcy5IYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX0sVnQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucmgpe2UuZGYoInBvc3Ryb2xsIik7ZS5qYigicG9zdHJvbGwiKTt0aGlzLkl0KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5HYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnFnKGMpKT90aGlzLkhjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmdkLHRoaXMucGxheWVyLnUoKSkpfX0scWc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYj0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihiPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTsKYT1hKGIpfXJldHVybiBhfSxydDpmdW5jdGlvbigpe3RoaXMucGxheWVyLk10KHRoaXMuVnQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTWEoKX0sSGQ6ZnVuY3Rpb24oYSl7ZS5qYigibWlkcm9sbCIpO2UuZGYoIm1pZHJvbGwiKTtpZighdGhpcy5naCl7dGhpcy5naD0hMDt2YXIgYj10aGlzLkdhKCJhZFRhZyIpO3RoaXMuR2EoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkdhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5IYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5nZCx0aGlzLnBsYXllci51KCkpKX19LHF0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuSHQodGhpcy5IZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LZSgpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XdCgpO3RoaXMucGxheWVyLktlJiZ0aGlzLnF0KCk7CnRoaXMucnQoKX0sc3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5CZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXYoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkNkPXRoaXMuQmQubGVuZ3RofSxEcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5DZCYmKGE9ITApO3JldHVybiBhfSx5dDpmdW5jdGlvbihhKXt0aGlzLnRoPWE7Zm9yKGE9MDthPHRoaXMuQmQubGVuZ3RoO2ErKyl0aGlzLkJkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYnQuYmluZCh0aGlzKSl9LGJ0OmZ1bmN0aW9uKGEpe3RoaXMuQ2QtLTthJiZ0aGlzLldlLnB1c2goYSk7CjA+PXRoaXMuQ2QmJnRoaXMudGgoKX0sSHI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuV2UubGVuZ3RoO2MrKyliPXRoaXMuV2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuaml8fGdhLFM9ITEsbmE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS2s9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzhdO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLkhpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLlFrPWI7Yi5wcm90b3R5cGU9e0prOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Lazp0aGlzLldqKGEpfSxXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlrOnRoaXMuR2koYSl9LEdpOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMuSGk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYz1jLlFrfHxqYyxVYz1uZXcgamMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5Kayg0KX0pLmNhbGwoaWV3YUphaGZhaXBoYWhKbyxpZXdhSmFoZmFpcGhhaEpvKTsK
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
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
Wed, 11 Sep 2019 07:34:50 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
de34-homad-1
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
index.html
cmp.teads.mgr.consensu.org/ Frame 9A65
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/201908291025/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:290::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
kGI/LkmsIcd2daPyZ44T91Tgh3nqFBaPCP2I5Rt/ZLlg5M5DrVepYy/Ac/ZfkFjnOAPn7svobKA=
x-amz-request-id
B87A212102411FA1
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
Wed, 11 Sep 2019 07:39:50 GMT
Date
Wed, 11 Sep 2019 07:34:50 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame 24F5
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/201908291025/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:290::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
kGI/LkmsIcd2daPyZ44T91Tgh3nqFBaPCP2I5Rt/ZLlg5M5DrVepYy/Ac/ZfkFjnOAPn7svobKA=
x-amz-request-id
B87A212102411FA1
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
Wed, 11 Sep 2019 07:39:50 GMT
Date
Wed, 11 Sep 2019 07:34:50 GMT
Connection
keep-alive
p2
sb.scorecardresearch.com/
Redirect Chain
  • 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=1568187290118&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?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=1568187290118&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?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=1568187290118&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=72567591&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
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

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
Wed, 11 Sep 2019 07:34:50 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

Redirect headers

Location
https://sb.scorecardresearch.com/p2?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=1568187290118&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=72567591&cs_ucfr=1
Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:50 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
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1568187290116&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=91
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
expires
Wed, 11 Sep 2019 07:34:50 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=1568187290116&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=91
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
expires
Wed, 11 Sep 2019 07:34:50 GMT
content-length
23
content-type
image/gif
p2
sb.scorecardresearch.com/
Redirect Chain
  • 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=1568187290162&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?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=1568187290162&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?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=1568187290162&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=46295054&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
23.43.115.95 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-43-115-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

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
Wed, 11 Sep 2019 07:34:50 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

Redirect headers

Location
https://sb.scorecardresearch.com/p2?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=1568187290162&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=46295054&cs_ucfr=1
Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:50 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
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1568187290160&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=91
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
expires
Wed, 11 Sep 2019 07:34:50 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=1568187290160&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=91
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
expires
Wed, 11 Sep 2019 07:34:50 GMT
content-length
23
content-type
image/gif
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%3A21%2C%22consent%22%3A%22%22%2C%22reason%22%3A210%7D%7D&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&formatVersion=2.22.61&env=js-web&netBw=9.5&ttfb=100
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.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
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
Wed, 11 Sep 2019 07:34:50 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
Wed, 11 Sep 2019 07:34:50 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%3A21%2C%22consent%22%3A%22%22%2C%22reason%22%3A210%7D%7D&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&formatVersion=2.22.61&env=js-web&netBw=9.5&ttfb=100
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.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
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
Wed, 11 Sep 2019 07:34:50 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
Wed, 11 Sep 2019 07:34:50 GMT
v2
de.tynt.com/deb/
4 B
200 B
Script
General
Full URL
https://de.tynt.com/deb/v2?id=s!sovrn&dn=IDS&cc=1&r=
Requested by
Host: cdn.tynt.com
URL: https://cdn.tynt.com/ids.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
208.100.17.187 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip187.208-100-17.static.steadfastdns.net
Software
/
Resource Hash
d21021784cda31eeae5c8295e047a14bda6ed5a9b5963fca9e7ceb398a9c9179

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
Wed, 11 Sep 2019 07:34:49 GMT
cache-control
max-age=86400
content-type
application/javascript
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
content-length
4
expires
Thu, 12 Sep 2019 07:34:50 GMT
p
ic.tynt.com/b/
0
119 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&cu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
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
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.14.0
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
iframe
sync.teads.tv/ Frame 3EE4
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=73584&userId=9fe48119-1143-4684-9e2d-4432e8602dc2&gdprIab={%22status%22:21,%22consent%22:%22%22,%22reason%22:210}&env=js-web&1568187290259
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/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=9fe48119-1143-4684-9e2d-4432e8602dc2&gdprIab={%22status%22:21,%22consent%22:%22%22,%22reason%22:210}&env=js-web&1568187290259
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=129994ec-9855-451d-937a-58060a65fbe2
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Wed, 11 Sep 2019 07:34:50 GMT
set-cookie
tt_exelate=; Expires=Thu, 12 Sep 2019 07:34:50 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Thu, 12 Sep 2019 07:34:50 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Thu, 12 Sep 2019 07:34:50 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Thu, 12 Sep 2019 07:34:50 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Thu, 12 Sep 2019 07:34:50 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Thu, 12 Sep 2019 07:34:50 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Thu, 12 Sep 2019 07:34:50 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=1568187290117&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=21&gdpr_consent=[gdpr_consent]&gdpr_reason=210&fv=91
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
expires
Wed, 11 Sep 2019 07:34:50 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=1568187290117&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=91
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
Wed, 11 Sep 2019 07:34:50 GMT
cache-control
max-age=0, no-cache, no-store
expires
Wed, 11 Sep 2019 07:34:50 GMT
content-length
23
content-type
image/gif
Cookie set beacon
ap.lijit.com/ Frame 2673
0
0
Document
General
Full URL
https://ap.lijit.com/beacon?informer=13413818&gdpr_consent=
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/www/sovrn_beacon_standalone/sovrn_standalone_beacon.js?iid=13413818
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
Resource Hash

Request headers

Host
ap.lijit.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
ljt_reader=32e959f092832321f71aa04c
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
Date
Wed, 11 Sep 2019 07:34:50 GMT
Content-Type
text/html;charset=utf-8
Transfer-Encoding
chunked
Vary
Accept-Encoding
X-Application-Context
application:prod:9080
Set-Cookie
tpro=eJxNUMtuhDAM%2FBefI%2BTw2i2%2F0b1VVRQFA5FCggJUqlb8e52wi3qb8UzGnjwhbBNF6J7gNjsTdChgDr0yYffbya75D8XVBg8dlAXCISDSQDFaP36SjmZ6UJxX6L6%2BBSwxDNZRyrXehDkjiagWt7MFi%2FImoELV4pu0qFjP7C4AVZWxvPMaE5yjMUdcEItawBh1r1YzZWcjwAd%2FSg2%2FGsn3Z7OBZu2ywJ4Lpvu1OVP1btKMF7%2B%2BAwuUAvQQlZ4zY0mvVvtMOGay65Jxmw6crOsj%2BZTlQ05n%2Fy%2FlpnXJDn2eL%2B%2BqqtOw4vZKlu80yeSWW%2FC8UfXHy9P8%2B7DmOI4%2FvRJ50A%3D%3D;Path=/;Domain=.lijit.com;Expires=Thu, 10-Sep-2020 07:34:50 GMT;Max-Age=31536000 ljtrtb_refresh=false;Path=/;Domain=.lijit.com;Expires=Sun, 15-Sep-2019 07:34:50 GMT;Max-Age=345600 ljtrtbexp=eJxdkDkOgEAMA%2F%2ByNUWSJRdfQ%2FwdCapMObFlW7mXrks9endUy7FsYsTkDYScSHMRXFQmnyg80ZBoUPi7u%2BBwMBKKCxo6GgyLHHn2c1nu%2BHTsseQHZuLzAqOmTU4%3D;Path=/;Domain=.lijit.com;Expires=Thu, 10-Sep-2020 07:34:50 GMT;Max-Age=31536000
Expires
Fri, 20 Mar 2009 00:00:00 GMT
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
Pragma
no-cache
P3P
CP="CUR ADM OUR NOR STA NID"
X-Powered-By
raptor
Content-Encoding
gzip
X-Sovrn-Pod
ap3ams1
sbt.js
static.cliipa.com/basev/1.0.304/ Frame 03CB
517 KB
116 KB
Script
General
Full URL
https://static.cliipa.com/basev/1.0.304/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.10 Phoenix, United States, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
tlb.hwcdn.net
Software
/
Resource Hash
30c40c7680ec2abf1393464c9c0823cae8bf9e8b61a911a7baed8170b43e8621

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 07:34:50 GMT
Content-Encoding
gzip
Last-Modified
Tue, 10 Sep 2019 12:40:54 GMT
ETag
"1568119254"
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=18378
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
117548
X-HW
1568187289.dop004.fr8.t,1568187290.cds061.fr8.shn,1568187290.dop004.fr8.t,1568187290.cds088.fr8.c
p
ic.tynt.com/b/
0
119 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.jpg&t=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme
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
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.14.0
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
5ea06bc1-fd62-4ac7-b19e-a890e0032537
https://www.giga.de/ Frame 03CB
1 KB
0
Other
General
Full URL
blob:https://www.giga.de/5ea06bc1-fd62-4ac7-b19e-a890e0032537
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/1.0.304/sbt.js
Protocol
BLOB
Security
, ,
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
185b9867-37be-45f1-b871-5c1b0418a6f1
https://www.giga.de/ Frame 03CB
1 KB
0
Other
General
Full URL
blob:https://www.giga.de/185b9867-37be-45f1-b871-5c1b0418a6f1
Requested by
Host: static.cliipa.com
URL: https://static.cliipa.com/basev/1.0.304/sbt.js
Protocol
BLOB
Security
, ,
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 03CB
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 03CB
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 B8C8
40 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.304/sbt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
19eecf8f26e673b201eb4708482fd5a672a15c66a8c0492f62ebb3d3f5b70cd0
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, 11 Sep 2019 07:34:50 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"275 / 721 of 1000 / last-modified: 1568045091"
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
12614
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:50 GMT
5a69aeaaaf6e230004edde93.mp4
inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a69aeaaaf6e230004edde93/ Frame 03CB
0
0

p
ic.tynt.com/b/
0
119 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.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_128_GCM
Server
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.14.0
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
pubads_impl_2019082901.js
securepubads.g.doubleclick.net/gpt/ Frame B8C8
158 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
ec6c461b6a7da1d28c5bb10b93c755c080ccdaed59821bdf1076bdc3866cc956
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, 11 Sep 2019 07:34:50 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 29 Aug 2019 13:06:32 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
59716
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:50 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame B8C8
113 B
178 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:80b::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
Wed, 11 Sep 2019 07:34:50 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
108
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/ Frame B8C8
76 KB
23 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3365265194975263&correlator=1183254271221861&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=20194812%2C21061864%2C21062832%2C21064170&vrg=2019082901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190911&iu=%2F5286166%2Fgiga.de%2FVidazoo-Passback-300x250&sz=300x250&eri=6&cookie_enabled=1&cdm=www.giga.de&bc=31&lmt=1568187290&dt=1568187290815&dlt=1568187290677&idt=130&ea=0&frm=23&biw=1585&bih=1200&isw=300&ish=250&oid=3&adx=968&ady=278&adk=3503934010&uci=l4nmzjz8qb14&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%2Fdownloads%2Fmicrosoft-word-2013%2Ftipps%2Fgroesser-und-kleiner-gleich-zeichen-auf-der-tastatur-in-word-excel-und-co.-schreiben%2F&loc=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&blev=1&bisch=1&ga_vid=2074368631.1568187291&ga_sid=1568187291&ga_hid=1481986177&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
006ba866764b4961682453ca84b693d9edda4e6b329bc3ecabf7e417bb3c0caa
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
Wed, 11 Sep 2019 07:34:51 GMT
content-encoding
br
x-content-type-options
nosniff
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
23142
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
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_2019082901.js
securepubads.g.doubleclick.net/gpt/ Frame B8C8
66 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019082901.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
05e529a757d25aa9d160d28e57c20041eee3f973870c0f0ad4ac7c21937254b1
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, 11 Sep 2019 07:34:50 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 29 Aug 2019 13:06:32 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
25315
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:50 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame B8C8
0
0

activeview
pagead2.googlesyndication.com/pcs/ Frame 03CB
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuUKgV66dJgMlVskuRnHZDclD9dZLLTo6hWY4mloc-1IK-3cNFDfpSqzLFGUTC5ioPVBgECmEzUV1TVXlZMndqmSDZM-7JVCh618rlFn1k&sig=Cg0ArKJSzA6lbVkwXjqmEAE&adk=3179048887&tt=-1&bs=1585%2C1200&mtos=1058,1058,1058,1058,1058&tos=1058,0,0,0,0&p=278,967.5,528,1267.5&mcvt=1058&rs=3&ht=0&tfs=1344&tls=2402&mc=1&lte=1&bas=0&bac=0&met=0&avms=nio&niot_obs=755&niot_cbk=839&md=2&rst=1568187289173&rpt=516&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1585%2C6164&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-16-16-15-98-14-0-0-0&tvt=2396&r=v&id=osdim&vs=4&uc=9&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190909
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:825::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
Wed, 11 Sep 2019 07:34:50 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
p
ic.tynt.com/b/
0
119 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.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_128_GCM
Server
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.14.0
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
p
ic.tynt.com/b/
0
119 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=0&img=https%3A%2F%2Fstatic.giga.de%2Fwp-content%2Fuploads%2F2015%2F07%2Fpaypal-login-rcm1200x627u.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_128_GCM
Server
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:50 GMT
server
nginx/1.14.0
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
p
ic.tynt.com/b/
0
119 B
Image
General
Full URL
https://ic.tynt.com/b/p?id=s!sovrn&lm=0&ts=1568187289790&dn=IDS&iso=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.2, ECDHE_RSA, AES_128_GCM
Server
208.100.17.185 Chicago, United States, ASN32748 (STEADFAST - Steadfast, US),
Reverse DNS
ip185.208-100-17.static.steadfastdns.net
Software
nginx/1.14.0 /
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

status
204
date
Wed, 11 Sep 2019 07:34:51 GMT
server
nginx/1.14.0
p3p
CP=NOI DSP COR NID PSA PSD OUR IND UNI COM NAV INT DEM STA
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
a70bd52b04b0429181c36c9ea8b56d449c45945555f4f31d00fb66e3f76d5b2e

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
Wed, 11 Sep 2019 07:34:51 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn87 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/201908291025/wrap.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
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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 e0064d0a2437e206ed082e1fa1cdae61.cloudfront.net (CloudFront), 1.1 varnish
age
344433
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-hhn4044-HHN
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1568187291.257122,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
omj5vaGwuVO0u1DUElZ04p0xjblvLHfKzDESlIUndnM3CZOy52LCcg==
x-cache-hits
211458
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/201908291025/wrap.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
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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 cc77875ec7dfc885cffaa2ec6fa578f6.cloudfront.net (CloudFront), 1.1 varnish
age
322171
x-cache
Hit from cloudfront, HIT
status
200
access-control-max-age
3000
content-encoding
gzip
content-length
5174
x-served-by
cache-hhn4044-HHN
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1568187291.258211,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
vary
Accept-Encoding
access-control-allow-methods
GET, HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
Hgfm8sbkx1gxZS7yha4CHuK3b3w9ezttWuCCZ4CAfr_LsIj39lkI7Q==
x-cache-hits
250648
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/
676 KB
180 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/OvaMediaPlayer.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.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
AmazonS3 /
Resource Hash
f49737b6c3e21187c8bbeb786a2657904a47ba34b42f12752f4e7fafb5889e7a

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 07:34:51 GMT
via
1.1 fab3f75b4ee7d58be154b12ee77e06eb.cloudfront.net (CloudFront), 1.1 varnish
age
154522
x-amz-meta-mtime
1568032630
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
183864
x-served-by
cache-hhn4044-HHN
last-modified
Mon, 09 Sep 2019 12:37:11 GMT
server
AmazonS3
x-timer
S1568187291.279691,VS0,VE0
etag
"ccfcd9e919d1659a44d13fd074133cbd"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA56
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
TdRuQfnjNfZM8uvwNDroWdWZ0x7zhcBKJ9K3-GNUrEgRBzlHtOY_-Q==
x-cache-hits
50384
st
convammp.taboola.com/
0
143 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7yWICFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosxisVrPRbDHZDWEDh8MNjbHbTFaL3WowGk0Wm81uMlysRqsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUcFhESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0ffw4EIcBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAu6AFidQUw2o91kdgAAAAB3_____3ogsZgZV76NxWMaLCybicOzMrksm8lqNlkMNrPFaHtD5UPUm7tGMH0jwjL7fQcF5fT0mF0GGctlMqgFsqbJ5TeIDxqG5WQQzG_CFqPVZLJZDmfLxWQwHA1Ho_0J3GiAEzQcDha7wWK3WAwni8losBwsUCAGE5yQ4WgzWY12q91kOZyMRrPNZIMUrVrNRpvBcDWbzHa71XAwXI5GSNGaxWwyWcxGy91msJyMBsPJcIgwYttMPMaFby1ZLUxu0XLjWwtHm9laZrGtjKPZajCYONei18d02k0my8Vwi4IBSnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXfWMyMK9_G4jENFpbNxOFZmVyWzWQ1mywGm9litK_YNhOPceFbS1YLk1u03PjWwtFmtpZZbCvjaLYaDCbOtej1MZ12k8lyMdw3VrPhYribDIf7xmo2XAx3k-Fw36EzfFefs1F50yo8OmXaL9QtZU6DwmWweH8S02LanR08v9_RqVJdNMaG7JtQmA0eg0ERSwSni3QiehlPF7FE8rRIJyrPamTxLQbL5WzlMLlMk8nMtJmNNivLbmJx7WYWsURpukgnet3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLov5jQ4xGc91srhgs55rBKgEAAAAAAAAALGHOvAkAAADAaSCLxWCyWC4AhBjrLsGnVMijE_hbcePHEHO6_F0uy1vztrh1Tp_D!&cmcv=&pix=31589837&cb=1568187291250&uv=23111&abt=des_vB!expl_vA!rtnf3_vB!sac5_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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187291.286500,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN
st
convammp.taboola.com/
0
52 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7yWICFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosxisVrPRbDHZDWEDh8MNjbHbTFaL3WowGk0Wm81uMlysRqsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUcFhESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0ffw4EIcBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAu6AFidQUw2o91kdgAAAAB3_____3ogsZgZV76NxWMaLCybicOzMrksm8lqNlkMNrPFaHtD5UPUm7tGMH0jwjL7fQcF5fT0mF0GGctlMqgFsqbJ5TeIDxqG5WQQzG_CFqPVZLJZDmfLxWQwHA1Ho_0J3GiAEzQcDha7wWK3WAwni8losBwsUCAGE5yQ4WgzWY12q91kOZyMRrPNZIMUrVrNRpvBcDWbzHa71XAwXI5GSNGaxWwyWcxGy91msJyMBsPJcIgwYttMPMaFby1ZLUxu0XLjWwtHm9laZrGtjKPZajCYONei18d02k0my8Vwi4IBSnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXfWMyMK9_G4jENFpbNxOFZmVyWzWQ1mywGm9litK_YNhOPceFbS1YLk1u03PjWwtFmtpZZbCvjaLYaDCbOtej1MZ12k8lyMdw3VrPhYribDIf7xmo2XAx3k-Fw36EzfFefs1F50yo8OmXaL9QtZU6DwmWweH8S02LanR08v9_RqVJdNMaG7JtQmA0eg0ERSwSni3QiehlPF7FE8rRIJyrPamTxLQbL5WzlMLlMk8nMtJmNNivLbmJx7WYWsURpukgnet3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLov5jQ4xGc91srhgs55rBKgEAAAAAAAAALGHOvAkAAADAaSCLxWCyWC4AhBjrLsGnVMijE_hbcePHEHO6_F0uy1vztrh1Tp_D!&cmcv=&pix=&cb=1568187291278&uv=23111&abt=des_vB!expl_vA!rtnf3_vB!sac5_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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187291.287045,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-HHN
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
18 KB
19 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.jpg
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
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
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:34 GMT
x-content-type-options
nosniff
age
185356
filer-source
3dc62a8e18f9b6ceb94ecf895297d72ce0545c5156c00f0fa8e434dc55d3102e
x-cache
HIT
status
200
accept-language
bytes
content-length
18921
x-xss-protection
1; mode=block
last-modified
Sat, 07 Sep 2019 12:36:06 GMT
server
nginx/1.10.3
filer-attr
W1s4OTAsNDg1XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 07 Oct 2019 12:36:06 GMT
tr
www.facebook.com/
44 B
246 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8083:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

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 07:34:51 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Wed, 11 Sep 2019 07:34:51 GMT
e2db082d-affd-4f1e-8d77-fb832da38e77
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/e2db082d-affd-4f1e-8d77-fb832da38e77
Protocol
BLOB
Security
, ,
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
c97bd604-a1e4-418d-9cb0-807f393e4bba
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/c97bd604-a1e4-418d-9cb0-807f393e4bba
Protocol
BLOB
Security
, ,
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/201908291025/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
Wed, 11 Sep 2019 07:34:51 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
tKq7230iBP/75HIazwSTtIgKBAKWav7f2wNpExvvRpJpHdOMd1onSwcOTNUFAJE7ai1oRBjulIY=
adex.js
dmp.theadex.com/d/607/2256/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/607/2256/s/adex.js?ts=93188002
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.108 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
f23d04df5067a82ed44a032393efa3b0fcbe492907b2fb72f77466832e1b8aed

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 07:34:51 GMT
content-encoding
gzip
last-modified
Tue, 11 Jun 2019 18:16:06 GMT
server
nginx
etag
W/"5cffefe6-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Wed, 11 Sep 2019 07:39:51 GMT
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=29993876
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.108 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
Wed, 11 Sep 2019 07:34:51 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:01 GMT
server
nginx
etag
W/"5d1f5601-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Wed, 11 Sep 2019 07:39:51 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/201908291025/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.29 Adamov, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn4.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
Wed, 11 Sep 2019 07:34:51 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:11:53 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, 17 Sep 2019 21:58:29 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/201908291025/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
fba9cccffa2a53735939d3d1cacb0379003f349f45ca514d629fbabd02fd4db8

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
Wed, 11 Sep 2019 07:34:51 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1543
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=55600439&src.id=Stroeer
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.206.36 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-206-36.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
Wed, 11 Sep 2019 07:34:51 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
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 77EA
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_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::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, 10 Sep 2019 21:55:28 GMT
expires
Wed, 09 Sep 2020 21:55:28 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
34763
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
osd.js
www.googletagservices.com/activeview/js/current/ Frame B8C8
76 KB
28 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_2019082901.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
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, 11 Sep 2019 07:34:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1568027754411643"
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
28408
x-xss-protection
0
expires
Wed, 11 Sep 2019 07:34:51 GMT
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/assets/
14 KB
3 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.3.9/assets/player.css
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201908291025/wrap.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
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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 7e3ec4bce6d89d06369eae9bcbd1cb7e.cloudfront.net (CloudFront), 1.1 varnish
age
154522
x-amz-meta-mtime
1568032632
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
2419
x-served-by
cache-hhn4044-HHN
last-modified
Mon, 09 Sep 2019 12:37:13 GMT
server
AmazonS3
x-timer
S1568187291.461321,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
FRA56
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
dA7g7S1Iiyx4vQ-d-7ZjBwfCKKgR2XQyVMhFOLDrh3nW0WHG1K6IeA==
x-cache-hits
50042
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.3.9/OvaMediaPlayer.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
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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 15d3b4db3728feaae1780610a1bac86e.cloudfront.net (CloudFront), 1.1 varnish
age
1179429
x-cache
Miss from cloudfront, HIT
status
200
content-encoding
gzip
content-length
499
x-served-by
cache-hhn4044-HHN
last-modified
Mon, 29 Jul 2019 13:39:31 GMT
server
AmazonS3
x-timer
S1568187291.463839,VS0,VE0
etag
"d2ab13c0468acb5251b93e254b36f876"
vary
Accept-Encoding
content-type
application/octet-stream
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
0nv2OT_XPk-IG7z9z6oZo9TBdh3JN4CIlKPHiCNZtGPiLDGtmmFw1Q==
x-cache-hits
63480
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=V7yWICFgMVghDn6Ii4GwQVghDn6Ii4GwUAAAAGBvQHGzgcbmiM3WayWuxWg9FosxisVrPRbDHZDWEDh8MNjbHbTFaL3WowGk0Wm81uMlysRqsphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G77QdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-wXPQ2Hz1_wcB4eZrfY73Pa3Zq_W-cymj5v1d3k1vzdYr_Lc3orjZa32O9z2t2Cy99idrldfjkAAAAAPAAoFfZD_AACAEQAAAAASAAAAABQBFT8WwhcAAAAAGAAFGD9aABAcTCc62592Y0O1-dl9wcAwEMACADAgAIJwABOUwlARc7BCQAAAAAAAAAAy____38MgB7xmQxAhtJgD8CDD8ADUcFhESMAAAAASKY2j6NJnVBZVAEAEKRbAVwBAAS0ffw4EIcBAAAQjC3Qw-L3mx12jd_tMgAAAAAAAAAAs_-zfzQhojG3tCCWAl61X0AAgLVfQAAANnUDAHgLgAu6AFidQUw2o91kdgAAAAB3_____3ogsZgZV76NxWMaLCybicOzMrksm8lqNlkMNrPFaHtD5UPUm7tGMH0jwjL7fQcF5fT0mF0GGctlMqgFsqbJ5TeIDxqG5WQQzG_CFqPVZLJZDmfLxWQwHA1Ho_0J3GiAEzQcDha7wWK3WAwni8losBwsUCAGE5yQ4WgzWY12q91kOZyMRrPNZIMUrVrNRpvBcDWbzHa71XAwXI5GSNGaxWwyWcxGy91msJyMBsPJcIgwYttMPMaFby1ZLUxu0XLjWwtHm9laZrGtjKPZajCYONei18d02k0my8Vwi4IBSnsRXKQTzenyd7ksb83b4tY5fQ6LWKI5WaQT2WXfWMyMK9_G4jENFpbNxOFZmVyWzWQ1mywGm9litK_YNhOPceFbS1YLk1u03PjWwtFmtpZZbCvjaLYaDCbOtej1MZ12k8lyMdw3VrPhYribDIf7xmo2XAx3k-Fw36EzfFefs1F50yo8OmXaL9QtZU6DwmWweH8S02LanR08v9_RqVJdNMaG7JtQmA0eg0ERSwSni3QiehlPF7FE8rRIJyrPamTxLQbL5WzlMLlMk8nMtJmNNivLbmJx7WYWsURpukgnet3L4jAcPn_Bw3l4mP2ip-Hw-QsezsPD7Bb7fU67W_N361xG0-etupvcmr9b7Hd5Tm-l0fIW-31Ou1tw-VvMLrfLov5jQ4xGc91srhgs55rBKgEAAAAAAAAALGHOvAkAAADAaSCLxWCyWC4AhBjrLsGnVMijE_hbcePHEHO6_F0uy1vztrh1Tp_D!&cmcv=&uv=23111&unm=FEED_MANAGER&cb=1568187291452&abt=des_vB!expl_vA!rtnf3_vB!sac5_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
Wed, 11 Sep 2019 07:34:51 GMT
via
1.1 varnish
server
nginx/1.13.12
x-timer
S1568187291.470403,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4080-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&_=1568187291489.935660623
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
Wed, 11 Sep 2019 07:34:51 GMT
Last-Modified
Mon, 26 Aug 2019 12:29:06 GMT
ETag
"5d63d092-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
p.min.js
cdn.emetriq.de/adp/profiling/0.2.2/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.2/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:3600:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
0161504a412281d7c5e626b19e17e84295593b2c4e373826ca1e35a2579508bb

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, 11 Jun 2019 07:55:18 GMT
content-encoding
gzip
last-modified
Fri, 07 Jun 2019 11:50:36 GMT
server
AmazonS3
age
7947574
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
xx8i10qOhfwpOULfQBi5YwU2PFbxz7Th
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
HEL5TvX7kqjo-P8bDbAOLFehWiEmPHljZusCsxVSXLhvYG-woU9v5w==
via
1.1 ad93a72606d0015c6aa5ceae5dc8a8d5.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.125 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
Wed, 11 Sep 2019 07:34:51 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=e31d4beb14948a7bc188c1d3a9a51832&event_id=page_view&_sid=69511&_ver=0.2.2&_seg=jsonp&_=326828944560
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.2/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
6ded010a9d7f3cf4f895f33dc0ca854e8b1a20ac456caf2f30d1d06855a5b0d6

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 07:34:51 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
34.250.43.132 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-250-43-132.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, 09 Sep 2019 14:48:30 GMT
Content-Encoding
gzip
Last-Modified
Mon, 09 Sep 2019 14:40:38 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 5984
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCEiU3Ws7ZBSaCWDUkWsfABifABSfABSfABi7ABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4203577252589578194
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4203577252589578194
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
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.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
Wed, 11 Sep 2019 07:34:51 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
Wed, 11 Sep 2019 07:34:51 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=4203577252589578194
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame 9BCF
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/201908291025/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.248.95.73 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-248-95-73.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
Wed, 11 Sep 2019 07:34:51 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=e31d4beb14948a7bc188c1d3a9a51832
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.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
Wed, 11 Sep 2019 07:34:52 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"
csi
csi.gstatic.com/
0
56 B
Other
General
Full URL
https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~k0ey7zsy&c=8223080048408&e=20199335%2C21060078&ctx=1&met.9=1.b0&met.1=1.k0ey7zc0~6.0~7.1~8.2~9.2~10.h~11.8~12.h~13.3a~14.3l~15.3c~16.76~17.7o~18.7u~19.2oo~20.2op~21.2ow~22.4z~23.4z
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/rum.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4002:808::2003 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
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
Content-Type
text/plain;charset=UTF-8

Response headers

pragma
no-cache
date
Wed, 11 Sep 2019 07:34:52 GMT
last-modified
Wed, 21 Jan 2004 19:51:30 GMT
server
Golfe2
status
204
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
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
csi
csi.gstatic.com/
0
56 B
Other
General
Full URL
https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~k0ey7zsz&c=8223080048408&e=20199335%2C21060078&ctx=1&met.9=2.hv&met.1=1.k0ey7zc0~6.0~7.1~8.2~9.2~10.h~11.8~12.h~13.3a~14.3l~15.3c~16.76~17.7o~18.7u~19.2oo~20.2op~21.2ow~22.4z~23.4z
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190905/r20190131/rum.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4002:808::2003 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
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
Content-Type
text/plain;charset=UTF-8

Response headers

pragma
no-cache
date
Wed, 11 Sep 2019 07:34:52 GMT
last-modified
Wed, 21 Jan 2004 19:51:30 GMT
server
Golfe2
status
204
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
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
pd
eu-u.openx.net/w/1.0/ Frame 5D94
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.161.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=316630a8-92d1-046a-1a63-b52a9eed56ec|1568187292
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=316630a8-92d1-046a-1a63-b52a9eed56ec|1568187292; Version=1; Expires=Thu, 10-Sep-2020 07:34:52 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1568187292|mOgikimWiygu; Version=1; Expires=Thu, 26-Sep-2019 07:34:52 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.161.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Wed, 11 Sep 2019 07:34:52 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=316630a8-92d1-046a-1a63-b52a9eed56ec|1568187292; Version=1; Expires=Thu, 10-Sep-2020 07:34:52 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.161.0
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Wed, 11 Sep 2019 07:34:52 GMT
content-length
0
via
1.1 google
alt-svc
clear
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 0192
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_256_GCM
Server
2.18.232.130 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_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

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

Request headers

Host
ads.pubmatic.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_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

Last-Modified
Fri, 26 Jul 2019 09:39:45 GMT
ETag
"13006b6-9bf6-58e925294ef26"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14898
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=162234
Expires
Fri, 13 Sep 2019 04:38:46 GMT
Date
Wed, 11 Sep 2019 07:34:52 GMT
Connection
keep-alive
Vary
Accept-Encoding
usync.html
eus.rubiconproject.com/ Frame 0C80
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.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_256_GCM
Server
104.111.230.142 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-230-142.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.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

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Mon, 09 Sep 2019 18:54:08 GMT
Content-Encoding
gzip
Content-Length
7571
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=14551
Expires
Wed, 11 Sep 2019 11:37:23 GMT
Date
Wed, 11 Sep 2019 07:34:52 GMT
Connection
keep-alive
Vary
Accept-Encoding
utsync.ashx
ml314.com/ Frame E041
573 B
1 KB
Script
General
Full URL
https://ml314.com/utsync.ashx?pub=&adv=&et=0&eid=50282&ct=js&pi=&fp=&clid=&if=1&ps=&cl=&mlt=&data=&&cp=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pv=1568187289853_kzef93p31&bl=en-us&cb=2676425&return=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5031%263pid%3D%5BPersonID%5D&ht=&d=&dc=&si=1568187289853_kzef93p31&cid=&s=1600x1200&rp=
Requested by
Host: ml314.com
URL: https://ml314.com/tag.aspx?118
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.106.135 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-106-135.eu-west-1.compute.amazonaws.com
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
14292f59d04484f19cd16c904540ad0a09e9bfa1243ba5f87193b86567c71ec6

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
Wed, 11 Sep 2019 07:34:52 GMT
Content-Encoding
gzip
Server
Microsoft-IIS/10.0
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Vary
Accept-Encoding
p3P
CP="NON DSP COR ADMo PSAo DEVo BUS COM UNI NAV DEM STA"
Cache-Control
private
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
398
Expires
0
csync.ashx
ml314.com/ Frame E041
Redirect Chain
  • https://ib.adnxs.com/getuid?https://ml314.com/csync.ashx%3Ffp=$UID%26person_id=5978151496344721696%26eid=2
  • https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%3A%2F%2Fml314.com%2Fcsync.ashx%253Ffp%3D%24UID%2526person_id%3D5978151496344721696%2526eid%3D2
  • https://ml314.com/csync.ashx?fp=3739492794812319017&person_id=5978151496344721696&eid=2
43 B
312 B
Image
General
Full URL
https://ml314.com/csync.ashx?fp=3739492794812319017&person_id=5978151496344721696&eid=2
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.106.135 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-106-135.eu-west-1.compute.amazonaws.com
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Wed, 11 Sep 2019 07:34:52 GMT
Server
Microsoft-IIS/10.0
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Content-Type
image/gif
Cache-Control
private
Connection
keep-alive
Content-Length
43
Expires
Thu, 12 Sep 2019 03:34:53 GMT

Redirect headers

Pragma
no-cache
Date
Wed, 11 Sep 2019 07:34:54 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.14:80
AN-X-Request-Uuid
4d76e7db-bc3d-4218-b75c-3cbf07494af4
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://ml314.com/csync.ashx?fp=3739492794812319017&person_id=5978151496344721696&eid=2
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
csync.ashx
ml314.com/ Frame E041
Redirect Chain
  • https://tags.bluekai.com/site/20486?limit=0&id=5978151496344721696&redir=https://ml314.com/csync.ashx%3Ffp=$_BK_UUID%26person_id=5978151496344721696%26eid=50056
  • https://ml314.com/csync.ashx?fp=37f1mx9999YqXlC5&person_id=5978151496344721696&eid=50056
43 B
312 B
Image
General
Full URL
https://ml314.com/csync.ashx?fp=37f1mx9999YqXlC5&person_id=5978151496344721696&eid=50056
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.106.135 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-106-135.eu-west-1.compute.amazonaws.com
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

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
Wed, 11 Sep 2019 07:34:52 GMT
Server
Microsoft-IIS/10.0
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Content-Type
image/gif
Cache-Control
private
Connection
keep-alive
Content-Length
43
Expires
Thu, 12 Sep 2019 03:34:53 GMT

Redirect headers

Location
https://ml314.com/csync.ashx?fp=37f1mx9999YqXlC5&person_id=5978151496344721696&eid=50056
Date
Wed, 11 Sep 2019 07:34:53 GMT
Connection
keep-alive
Content-Length
0
BK-Server
61b7
P3P
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV", policyref="http://tags.bluekai.com/w3c/p3p.xml"
match
ps.eyeota.net/ Frame E041
Redirect Chain
  • https://ps.eyeota.net/pixel?pid=r8hrb20&t=gif
  • https://ps.eyeota.net/pixel/bounce/?pid=r8hrb20&t=gif
  • https://ml314.com/utsync.ashx?eid=50052&et=0&fp=2ynK7ETltZJB4QC_I2DLaJC8nyPgtbh04k_FWhG64Bf4&gdpr=1&gdpr_consent=&return=https%3A%2F%2Fps.eyeota.net%2Fmatch%3Fbid%3Dr8hrb20%26uid%3Dnil
  • https://ml314.com/csync.ashx?fp=2ynK7ETltZJB4QC_I2DLaJC8nyPgtbh04k_FWhG64Bf4&person_id=5978151496344721696&eid=50052&return=https%3a%2f%2fps.eyeota.net%2fmatch%3fbid%3dr8hrb20%26uid%3dnil
  • https://ps.eyeota.net/match?bid=r8hrb20&uid=nil
70 B
171 B
Image
General
Full URL
https://ps.eyeota.net/match?bid=r8hrb20&uid=nil
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
54.93.117.16 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-93-117-16.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
de9d3fd0eb948bd294477d0eda60a73b85caff1794803530d0463193a113da98

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
Wed, 11 Sep 2019 07:34:53 GMT
Content-Length
70
Content-Type
image/gif

Redirect headers

Date
Wed, 11 Sep 2019 07:34:52 GMT
Server
Microsoft-IIS/10.0
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Content-Type
text/html; charset=utf-8
Location
https://ps.eyeota.net/match?bid=r8hrb20&uid=nil
Cache-Control
private
Connection
keep-alive
Content-Length
168
Expires
Thu, 12 Sep 2019 03:34:53 GMT
merge
ce.lijit.com/ Frame E041
0
532 B
Image
General
Full URL
https://ce.lijit.com/merge?pid=5031&3pid=5978151496344721696
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.9 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
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
Wed, 11 Sep 2019 07:34:52 GMT
Server
nginx
X-Powered-By
raptor
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
X-Sovrn-Pod
ap3ams1
Content-Type
text/html;charset=utf-8
X-Application-Context
application:prod:9080
Expires
Fri, 20 Mar 2009 00:00:00 GMT
data
lb24.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb24.s400.meetrics.net/data?/WWT8LLOBALlnFFLl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A24Ax4A3yA43A3xAyoE3qFjvF0wFy5FuBFUkzF2BPSAAAAAAAAByiXAPAAAFAAyiXTMPsAPAAAJPAWEABMPsAZBAAOA55A55A85B55A58E55A55AFA52A0zA0BErMPsAPgFAJPAWEAHMPsAPkTAAZAwSAcAAAASksFhFjAAAAAAAAAAAAEAAAyiXAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA21AwwAz2AyzAGAkpFylFj0FAAAAJAxzAxxA12A4xA1BEKA1wAw1A43A40Ax4AJAylFj0FhuFnsFlBFKA1wAw1A43A40Ax4AKA1wAw1A43A40Ax4AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAMPsAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFTTT/SA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h216.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
Wed, 11 Sep 2019 07:34:53 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 11-Sep-19 07:34:52 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=1568187298126&__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
Wed, 11 Sep 2019 07:34:58 GMT
Last-Modified
Thu, 03 Sep 2009 07:34:24 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
Wed, 05 Sep 2012 07:34:24 GMT
/
onetag-geo.s-onetag.com/
23 B
429 B
XHR
General
Full URL
https://onetag-geo.s-onetag.com/
Requested by
Host: beacon.s-onetag.com
URL: https://beacon.s-onetag.com/beacon.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20bb:2200:5:ae3a:ba00:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
ad16e1b37490fca28df99d039d6373d2fee4d894fcd279d95b90ae872f4d860f

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
Wed, 11 Sep 2019 07:27:47 GMT
via
1.1 2ef0748a2a8fca13fd6065b6b046c33c.cloudfront.net (CloudFront), 1.1 40b36a86ab4ea993a78087b1ceb80e25.cloudfront.net (CloudFront)
age
431
x-amzn-requestid
1ccacd44-ab08-4938-a154-2b47ec7f6bee
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600
x-amz-cf-pop
FRA6-C1, FRA56
x-amz-apigw-id
f149-FG5yK4FR8g=
content-length
23
x-amz-cf-id
eCiFs5V6rYgAJDkp-AiOeDteRW470ieaZSmzozW5UapNnzDOpRfS2A==

Failed requests

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

Domain
tpc.googlesyndication.com
URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
Domain
inventory.cliipa.com
URL
https://inventory.cliipa.com/551424a21b1b1f08006fb6f9/5a69aeaaaf6e230004edde93/5a69aeaaaf6e230004edde93.mp4
Domain
tpc.googlesyndication.com
URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=2

Verdicts & Comments Add Verdict or Comment

327 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| 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 string| szmvars object| iom object| smbVideoService object| pagespeed object| iam_data object| adsbygoogle number| LUX_t_start number| LUX_t_end object| gaLog object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer 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 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 function| setImmediate function| clearImmediate string| state object| __onetag object| __connect boolean| apstagLOADED object| nativendo_588f272a3e49c_conf object| google_tag_manager object| de_meetrics object| closure_memoize_cache_ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk object| _econa function| send object| google_optimize function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async number| google_global_correlator object| google_rum_config object| __google_ad_urls number| __google_ad_urls_id object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired function| _ object| confiant object| _taboola 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| _google_rum_ns_ object| NUGGjson string| n_pbt object| _m6rq object| stroeerCore boolean| google_DisableInitialLoad boolean| google_noFetch string| preloadType function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| webpackJsonpdkuim object| Base64 boolean| dkuimInited object| TRC object| _tblConsole undefined| msg object| _comscore function| $ function| jQuery function| isEmpty object| gapi object| ___jsl number| _m6rApiLoaded object| google_image_requests string| sdm_ift 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 function| udm_ object| ns_p object| COMSCORE string| sovrn_beacon_tid object| nativendo_588f272a3e49c_map object| LJT_Ads function| stroeerCoreConnect object| containers object| images object| trcManager object| trcRbox object| options object| Tynt object| _33Across function| __cmp object| cmTag object| teadsscript function| startCMTagMain object| teads object| cp2 boolean| isCmTagFMOnPage string| category undefined| google_rum_values 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 object| _EQLService object| _EQPScript function| _h object| _adexc object| adex object| ibb_lib object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

0 Cookies

4 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 (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
ads.pubmatic.com
adscale.nuggad.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adx.adform.net
ajax.googleapis.com
ap.lijit.com
api.theadex.com
apis.google.com
bbcdn-bbnaut.ibillboard.com
bcp.crwdcntrl.net
beacon.s-onetag.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
cdn.tynt.com
cds.taboola.com
ce.lijit.com
cm.g.doubleclick.net
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
csi.gstatic.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
de.tynt.com
dfp-gateway.s-onetag.com
dkuim.de
dmp.theadex.com
dx.bigsea.weborama.com
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
files.giga-video.de
get.s-onetag.com
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
gslbeacon.lijit.com
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ic.tynt.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
inventory.cliipa.com
irqs.ioam.de
js.adscale.de
js.stroeermediabrands.de
lb24.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.oadts.com
ml314.com
native.adscale.de
onetag-geo.s-onetag.com
p.adsymptotic.com
pagead2.googlesyndication.com
pd.sharethis.com
pixel.quantserve.com
pixel.rubiconproject.com
ps.eyeota.net
px.powerlinks.com
rd.frontend.weborama.fr
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
segments.company-target.com
server.cliipa.com
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
static.cliipa.com
static.giga.de
sync.teads.tv
t.nativendo.de
t.teads.tv
tags.bluekai.com
tpc.googlesyndication.com
track.adform.net
tracker-adserver.ibillboard.com
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
vap3ams1.lijit.com
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
tpc.googlesyndication.com
104.109.82.87
104.111.230.142
104.111.241.32
104.111.246.233
104.16.87.26
104.18.102.194
107.178.241.34
109.71.25.30
130.211.13.252
136.243.4.14
143.204.211.231
143.204.214.60
143.204.214.67
143.204.214.70
144.76.115.247
151.101.114.2
151.101.114.49
151.101.13.194
151.101.14.217
161.156.66.178
172.217.22.34
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.185.201.52
18.196.130.47
185.22.221.117
185.33.223.216
185.64.189.112
188.40.16.106
192.132.33.46
193.46.63.75
194.213.222.29
2.18.232.130
2.18.232.7
2.18.233.180
2.18.233.67
2.18.234.72
2001:4de0:ac19::1:b:2a
208.100.17.185
208.100.17.187
216.58.206.2
23.43.115.95
2600:9000:20bb:2200:5:ae3a:ba00:93a1
2600:9000:20bb:3600:1c:8c89:a300:93a1
2600:9000:20bb:5e00:a:52eb:a100:93a1
2600:9000:20bb:9600:5:9a4c:9b00:93a1
2600:9000:20bb:a400:1f:287:d20a:ce1
2606:4700:20::6819:ad0d
2a00:1450:4001:809::200a
2a00:1450:4001:80b::2002
2a00:1450:4001:817::200a
2a00:1450:4001:821::200e
2a00:1450:4001:824::2003
2a00:1450:4001:825::2001
2a00:1450:4001:825::2002
2a00:1450:4001:825::200e
2a00:1450:4002:808::2003
2a02:26f0:6c00:290::2c92
2a02:26f0:6c00:2bc::5f76
2a03:2880:f11c:8083:face:b00c:0:25de
34.248.95.73
34.250.208.218
34.250.43.132
34.95.120.147
35.156.29.62
35.190.16.14
37.157.4.25
37.157.4.40
40.113.136.100
46.253.113.178
52.208.73.164
52.219.73.199
52.28.206.36
52.29.122.216
52.31.106.135
52.31.41.246
52.34.54.104
52.94.216.48
54.243.114.159
54.243.119.74
54.76.241.124
54.93.117.16
62.168.44.126
69.16.175.10
69.173.144.143
69.173.144.165
72.251.249.9
80.82.201.88
89.163.159.108
89.163.159.125
91.215.100.39
91.215.100.40
91.228.74.212
006ba866764b4961682453ca84b693d9edda4e6b329bc3ecabf7e417bb3c0caa
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
0161504a412281d7c5e626b19e17e84295593b2c4e373826ca1e35a2579508bb
02a7b0524c2c00da3b4d41595a90ff9ebdd1662955c3919e412ca07ce79f118e
03b48f18b2d6d1c1f4f392881dc2c4e9801f275d17a9f0f30ebddb3341844e77
040a656163007312458fb5e23d55742ce8ef233859301c70be4e31f317d5fa5c
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
052da30de87681d138df57ad1bf5705fcf879ee1e80cb1cb2e4ced21c1712c91
05e529a757d25aa9d160d28e57c20041eee3f973870c0f0ad4ac7c21937254b1
0baa1b7da945fc3334d5683c8502c3da91529a8a35afaf0e591be34633adf609
0cd88df3a26fa65f5e8a2a0a47829afaed5017169f83145500aa3ebb0c52de60
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0f51b6594e913d4184adf3ca9ec8654a67110ae742e1c61472dacd56e14a6fa6
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
13fb263462e11a1a4634467a9070505f3737e03b94a6fb0b42dda0c43ab53f37
14292f59d04484f19cd16c904540ad0a09e9bfa1243ba5f87193b86567c71ec6
1618f085a042d5d629ad5d8de16d4ffe7b8ae3a6188c0a6fabe5a3d0db6bd1b8
167bcacbd46c5803ae0df7fea4bf75363ee2a7a854226f672ca4431ba241859a
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f
18fb2b55cf8f17a3ecffab0fe2223921a6ccba4bffd6ed33a03ef3bf619a9148
19eecf8f26e673b201eb4708482fd5a672a15c66a8c0492f62ebb3d3f5b70cd0
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
1b00a5cb16c91a06ace93e2b1bafe7394f3bbeff13b2fcd6ed53f5207e1c9e20
1b35bd23206a199b500fdb41aa9dd3ddedb9cbfdd2f1b1da79c5a3f916e737e5
1d620a0f7dc002fca2d94bf2da586b9198b9fa94a3b53e9eeb069833081f119d
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
20344f6c2576e888645689814108b6019491071d53d5f4b3edc294951a5de023
20d9df1102585ece75fec7d91e5e34837cbe41fa16e0d7f29eab5142affd592f
2406df3da85e2fe3a84e07b048e0b2a3ff1272af51ea78914d542cca9720a2bf
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
25f14c4ae52c878aa8b971df090c30c53b22fc1934c71535b98c1b64aa5b90e1
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
287208897e7a721606ca56270a90e1e8affb12efa108047980b6026436f2ddae
2a6a6a1287ae0f8efc05591091b90426e98c0ca24e926301086f7bce17cd9423
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
30c40c7680ec2abf1393464c9c0823cae8bf9e8b61a911a7baed8170b43e8621
3129f79d675b722127fb444575457ed12ff5341b4309541e5b4c5e14fc421135
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3b1011d0eada4c1977bc4c2d1036d1d4618c4361e870bcd81057e60fd5771d9b
3b7b8a4b411ddf8db9bacc2f3aabf406f8e4c0c087829b336ca331c40adfdff1
3ddb12be58c8d1e4f15ed6bd23266bbcb098846570ef8fcfd819be9af32ea25c
3e519113583c968dd0daa3a70249fc54df7114ba2595bfe1644d2320e6d25aa5
3e82f5310fe957108f5b1f2c3c701763f296b335802dbc630704331974feb40c
3fafca44c304f7b6eab7180819c3732b59e55eac85e21e595cb75869498952e0
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
429e8f62ea6700f952db60ed9f95d5c6b4791a4d8cd2877424c8f17a1793a184
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
447c87839e7f642d1141287acb1e5811eb9ed03e6671f4e092e7752d20173a2c
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
521a5ee50dd61f7f1c507642547234f718f563550d908fa000000f7c84a8d573
52b9e38359d28b25df0896fd56c1fe0e2dfa20e178baab3822213b49a5cdec97
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
567d96c9d8b08252cc609253eb57ad5ae304f8f3b5da57ca6ed9f0d3b7d84b02
58d9efad2053d80cdfa268429487416fad20a6366343f48c47e8aa8437d7e584
599702a6babb221269ef1ad7b9faffc61139cfc32b10038b2bafb61615e7d5c9
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642
5afbbee8748df44c7e896542d90265ac65a7764070aa62948af2ed1819d9840f
5f05a28af8bfc36985245f09034fd8de6794a7deb250aa4476af6569289724b7
5f7c7709d592c7e19dc12152d7adce8a117f08af40a2facd69c19b495c9a1047
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
662fa6bcdf71d8f92e29010d3e2e270e0071e5d19b1d14ce205654a78aa0a7a9
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6a157c77153a760d884ee2996cce42e36fd78ee59803c7d6744fde39293b5666
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6c7ed2d548e889f2bd271cc326596ba4ad529474c3881bf3fcbc39d8d3213706
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6ded010a9d7f3cf4f895f33dc0ca854e8b1a20ac456caf2f30d1d06855a5b0d6
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
79345021f111ae91aa428a05560bca86eb37eecf8193fb7fb1ed5b4f9e923002
7ca541ae05839ff79554d3430282e15191cad0039ffac352ac85c5eb0cc59f22
7d06f4e5f7a31127824b0a4aa02b95910f8282233a3cdb043b96f0d271f19b41
7d655e8cd62ba58d86b3bc9c8e1e04a76506a4dfc852c3b3813deb0aef284548
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
834aadbf7daffdd4fb668c28184b5a36bf86d64eb33d264abcbc5512a96019f8
853c392f2bdc84af0e62dabea07eae48b8295da0c1fdfd86164f977ba7fbc70d
85a61531ef23d17d28f0adc0b3447167e25658d93f8026164e3937442b8b3939
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8ac7d704a20f1e1c52694126df1a3d17ae2c0ee5f759d76a21ef2ee32512712e
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8e920612ce29a3290fc2edbaab7647470f21dda35cc1a350f9b8b362fc4d3ebe
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
91ffef0e08af098862c5ee0b413103869650c929e0a65fbd29e5815e3b402609
92f5fdb2be157bac1c050ae74fdd9269b35c817ea16931ae9998c2dc27bfd0c4
9577813fe87cfe961576762bfb2d22a20545fa7611d71e9788283bc6bc72f6b0
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
9b404c617f947b58e4c257e9d622512567b05283f1ce4894b11273982c534f71
9b9f3d905ebf4de7d11a53380168ce066850f5f415aab71e8acee8e0b46618e3
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a04fc6430fced9fbcb030d0affb35b5a022e89da03bb0293b6f11ce5309fd5b3
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a1077ea2c782ef0d45b33880c7ba1fee42a42b145984a64496425d35fbc5284b
a70bd52b04b0429181c36c9ea8b56d449c45945555f4f31d00fb66e3f76d5b2e
a88f634d6fbb391a3ce5cbcb74dfe045a0f6eb7ec91990818a511ed391d80983
a8c233789a814228dc9a80d5a95832045d56912283efa70435e8d3a006404d68
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
abd092a004e2bc0fe1917450f67546975681dd25ccccff63d26c4ea8f137d5f8
ad16e1b37490fca28df99d039d6373d2fee4d894fcd279d95b90ae872f4d860f
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b2cd7de9873f721decdc67b217b48247a2f03deb326a4e8d34bc521cabff5741
b42f76007502ed6288ff212f62afa2f3d74d5cd988bf2a7fc921b62e1f67e9c9
ba78228683af43e25c31f85ad078af375af1cab55f5b897af66556565e9b178c
bcd1aed80d001c6e2dd7d6cdb8afc479d590f0626275ead449144986cd2fc0ab
bdc68de5e41eec35b166fa018d3fb6522ba56ad797917fdb0804fd13419ba8c1
be701739dbd531e7a05df6dea81b4666d177b2ef14503eba47e7bf220959788d
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c1f4b48cf64b1d62f7ac56e47f4654cc28d949cdb83d9a0fa7be561c498b20d7
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
c959d175ccf2a5f270b3ec797d22c21c2fb414e5ddb0c4e7d18cf8e7c3e13e14
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912
d21021784cda31eeae5c8295e047a14bda6ed5a9b5963fca9e7ceb398a9c9179
d414d33904b7f1f70da24215298772bbe90ded3c70d5a9f96ec8eeac147181cb
d660ab84478e30350d7dc1aafa87d4eb646645dcd4026f181afd3b10c20db666
d6af9eda08729e007970d2ecd0a08c6282e37c2e58b16ce0c10737d95b23b5ba
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
de9d3fd0eb948bd294477d0eda60a73b85caff1794803530d0463193a113da98
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
e02d515703c7645b1724e0f74e0feffcc591b2988b662de83b2cc6c7bb0375a4
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e735362ed82fa26fdc228818a71a3a51a6981be6ef0057a90167f183942b8011
e7d3b55b502a3544dac407c356d2805d4f6c9bca4d7ad1c0f3fd5e5e62fcdc5e
e86768edbadf843426e0dc7081f579c2df36d45b031aaa6ef2df1f6bd88c8266
e88360f9b89be1fc9cc456883799afb4dbbf3c0029d6fc225053f7e7da298620
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
ec6c461b6a7da1d28c5bb10b93c755c080ccdaed59821bdf1076bdc3866cc956
ed12abebf74d61e8a6846dd87861bbe0c58355d207ef453eabd28a82e0519496
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ee441245ef85f538030acf5e534d1cf2664c18289cec8cc0d84656ffb0e0a95d
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f21a7216b774be0fdbe4267a5630aa74311f31d3be4c0950f9a1192db4f566f3
f23d04df5067a82ed44a032393efa3b0fcbe492907b2fb72f77466832e1b8aed
f24cf6322865cc2eff1d20b7cfb90b05a3b32a4054ecd7f92c64f15ca16029d6
f2f6180a65038b9ef6eb958ba11c1d049f52081b6550dc396c4f0a887f31a61f
f49737b6c3e21187c8bbeb786a2657904a47ba34b42f12752f4e7fafb5889e7a
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
fba9cccffa2a53735939d3d1cacb0379003f349f45ca514d629fbabd02fd4db8
ff979ff06519d05cc49427b9ab4e5ac99ff71d4eddb15c935f0edc30dbd540ca